在一些采访中我被问到以下代码的输出是什么:
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
函数中的第三个参数代表什么?
答案 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函数的第二个参数。