按顺序排列的Javascript警报输出

时间:2017-10-16 18:40:51

标签: javascript asynchronous settimeout

在一些采访中我被问到以下代码的输出是什么:

function say(a) {
    alert(a);
}
say(1);
setTimeout(say(2), 5000);
setTimeout(function() {
    say(3);
}, 1000);
setTimeout(say, 2000, 4);

它应该提醒1 2 3 4但我不知道为什么按此顺序而且我不明白最后setTimeout函数中的第三个参数代表什么?

4 个答案:

答案 0 :(得分:0)

  

param1,...,paramN可选附加的参数   一旦定时器进入函数或代码指定的函数   到期。   最后一次调用中的4作为参数传递给say函数。

答案 1 :(得分:0)

第三个参数计划回调在将来的某个时刻运行。

您对setTimeout(say(2), 5000)的第一次呼叫实际上与第一次呼叫say(1)相同,因为它们都会立即调用say功能。你需要像其他人一样传递一个函数。

所以第一个会安排5秒钟,但不是因为立即调用。最后两个计划为1秒,然后是2秒。

但是因为setTimeout回调是异步运行的,所以对setTimeout的所有调用都会立即发生,一个接一个地发生,而不等待任何回调。

setTimeout的最后一次调用将打印4,因为在毫秒参数之后给出的任何参数都会转发到回调,因此您的4值会被转发作为say的第一个参数。

答案 2 :(得分:0)

第3个参数是函数的参数如果使用参数太多(超过声明的参数)调用函数,则可以使用arguments对象来访问这些参数。所以这就是为什么它给4。 有关更多信息,请尝试以下功能

setTimeout(say, 2000);

上面的代码将提醒undefined这是因为如果调用一个缺少参数的函数(小于声明的),则缺少的值设置为:undefined

答案 3 :(得分:0)

首先它会提醒 1 ,然后在5秒后会提醒 2 ,然后在1秒后会提醒 3 ,最后它会在2秒后警告 4 。 settimeout意味着您需要在毫秒数后运行一个函数。因为这个函数有两个参数(你想要运行的函数,以及毫秒数);然后在第6行,你说你要定义一个特定的函数,在这个函数里面你要运行函数(嵌套),值1000是settimeout函数的第二个参数。