在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
答案 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

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