为什么设置超时's回调参数可以接受参数

why setTimeout's callback parameter can take parameters

本文关键字:参数 回调 超时 设置 为什么      更新时间:2023-09-26

在nodejs中,为什么我们可以将参数传递给setTimeout的回调函数
我知道,process.nextTick()由于aspected而崩溃,因为它将一个未定义的值作为函数
但是,setTimeout()究竟有什么神奇之处?

foo = function(a){
  console.log(a);
}
setTimeout(foo('hello'), 0); // work fine
process.nextTick(foo('hello'), 0); // TypeError: undefined is not a function

使用:

setTimeout(foo('hello'), 0);

您正在执行foo,并将结果(undefined)传递给setTimeout
这意味着,在setTimeout(foo('hello'), 0);运行的确切时刻,"hello"将被记录,但不是因为超时已经结束。

这是您的代码,但有10秒的延迟。注意代码如何立即提醒"hello",而不是在10秒后:

foo = function(a){
  alert(a);
}
setTimeout(foo('hello'), 10000);

设置超时时会立即调用foo('hello'),而不是在指定的延迟之后
要将参数传递给超时函数,您需要将函数调用封装在一个函数中:

foo = function(a){
  alert(a);
}
setTimeout(function(){
    foo('hello');
}, 1000);

这样,foo函数只有在超时结束后才会调用

process.nextTick(foo('hello'), 0);上获得TypeError: undefined is not a function的原因也是一样的。执行foo('hello'),返回undefined。该返回值被传递给process.nextTick。您还应该将其封装在一个函数中:

process.nextTick(function(){
    foo('hello');
}, 0);

setTimeout没有崩溃的原因是它不介意undefined作为函数参数:

setTimeout(undefined, 0)

你会看到它没有记录任何错误。