按顺序的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
顺序没有定义回调执行顺序。