按顺序的Javascript警报输出

按顺序的Javascript警报输出,javascript,asynchronous,settimeout,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函数中的第三个参数代表什么 param1,…,paramN传递的可选附加参数 通

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

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
函数中的第三个参数代表什么

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

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

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

所以第一个将被安排在5秒之外,但不是因为立即调用。最后两个时间安排为1秒,然后是2秒

但是,由于
setTimeout
回调是异步运行的,因此对
setTimeout
的所有调用都会立即一个接一个地进行,而无需等待任何回调


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

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

setTimeout(say, 2000);

上面的代码将警告undefined,这是因为如果调用函数时缺少参数(小于声明的参数),缺少的值被设置为:未定义的

首先它将发出警报1,然后在5秒后它将发出警报2,然后在1秒后它将发出警报3,最后它将在2秒后发出警报4。设置超时意味着您需要在毫秒数后运行函数。以及由于此函数接受两个参数(要运行的函数和毫秒数);因此在第6行中,您表示要定义一个特定函数,并在该函数中运行say函数(嵌套),值1000是settimeout函数的第二个参数。

那么为什么它会最后发出警报?为什么会发出此命令或警报?第一个警报只是简单地调用,没有任何延迟。传递给第二个调用的第一个参数不是函数声明,而是立即执行的函数调用。第三个在1秒(1000ms)后执行,第四个是在2秒之后。它不是这样工作的。调用的
setTimeout
顺序没有定义回调执行顺序。