请忽略这个代码没有实现任何目标的事实,并对可能是一个愚蠢的问题表示歉意!
我知道我无法将函数调用传递给setTimeout()
作为第一个参数,但是why我可以不这样做吗?
let names = ['Andy', 'Ross', 'David'];
function printer (name) {
console.log(name);
}
names.forEach(name => setTimeout(printer(name), 1000);
Result:
Andy
timers.js:327
throw new TypeError('"callback" argument must be a function');
^
我可以通过使用对的引用来解决问题printer
并使用bind()
发送name
随之而来,但为什么我必须采取这些额外的步骤呢?
let names = ['Andy', 'Ross', 'David'];
function printer (name) {
console.log(name);
}
names.forEach(name => setTimeout(printer.bind(null, name), 1000));
Result:
Andy
Ross
David
这是因为执行顺序的原因。如果你将一个函数调用传递给setTimeout,该函数将立即执行,即该函数立即放入JavaScript的执行堆栈中。
如果您传递函数名称,即对函数的引用,则只有在计时器完成后,该函数才会放入 javascript 线程的执行堆栈中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)