为什么setTimeout的回调参数可以带参数

时间:2014-11-05 08:39:48

标签: javascript node.js

在nodejs中,为什么我们可以将参数传递给setTimeout的回调函数 我知道,process.nextTick()已经崩溃,因为它将未定义的值作为函数 但是,setTimeout()会发生什么?

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

1 个答案:

答案 0 :(得分:2)

使用:

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);




这样,{/ 1}}函数只有在超时完成后才会被称为

foo上获得TypeError: undefined is not a function的原因是相同的。执行process.nextTick(foo('hello'), 0);,返回foo('hello')。此返回值将传递给undefined。你还应该将它包装在一个函数中:

process.nextTick

process.nextTick(function(){ foo('hello'); }, 0); 没有崩溃的原因是,它不会将setTimeout视为功能参数:



undefined




您会发现它没有记录任何错误。