为什么我不能将函数调用(而不是函数引用或匿名函数)传递给 setTimeout()? [英] Why can I not pass a function call (rather than a function reference or an anonymous function) to setTimeout()?
问题描述
请忽略此代码一无所获的事实,并为可能是一个愚蠢的问题道歉!
Please ignore the fact that this code achieves nothing and apologies for what's probably an inane question!
我知道我不能将函数调用传递给 setTimeout()
作为第一个参数,但是 为什么我不能这样做?
I understand that I cannot pass a function call into setTimeout()
as the first argument, but why can I not do that?
let names = ['Andy', 'Ross', 'David'];
function printer (name) {
console.log(name);
}
names.forEach(name => setTimeout(printer(name), 1000);
结果:
Andy
timers.js:327
throw new TypeError('"callback" argument must be a function');
^
我可以通过使用对 printer
的引用并使用 bind()
连同它一起发送 name
来解决问题,但是为什么我必须采取这些额外的步骤吗?
I can solve the problem by instead using a reference to printer
and using bind()
to send name
along with it, but why must I take these extra steps?
let names = ['Andy', 'Ross', 'David'];
function printer (name) {
console.log(name);
}
names.forEach(name => setTimeout(printer.bind(null, name), 1000));
结果:
Andy
Ross
David
推荐答案
这是因为执行的顺序.如果您将函数调用传递给 setTimeout,该函数将立即执行,即该函数会立即放入 javascript 的执行堆栈中.
This is because of the order of execution. If you pass a function call to setTimeout, the function will be executed immediately, i.e. the function is put on javascript's execution stack immediately.
如果您传递函数名称,即对函数的引用,则该函数仅在计时器完成后才放入 javascript 线程的执行堆栈中.
If you pass a function name, i.e. a reference to a function, the function is only put in the javascript thread's execution stack once the timer finishes.
这篇关于为什么我不能将函数调用(而不是函数引用或匿名函数)传递给 setTimeout()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!