Why can I not pass a function call (rather than a function reference or an anonymous function) to setTimeout()?

*爱你&永不变心* 提交于 2019-12-18 09:42:34

问题


Please ignore the fact that this code achieves nothing and apologies for what's probably an inane question!

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

Result:

Andy
timers.js:327
    throw new TypeError('"callback" argument must be a function');
    ^

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

Result:

Andy
Ross
David

回答1:


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.

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.




回答2:


you can try this:

setTimeout(function(){printer(name)}, 1000)



回答3:


setTimeout should take a function as its first argument.

Please refer:

https://www.w3schools.com/jsref/met_win_settimeout.asp

Here you are passing the result of the function as the first argument which is undefined.




回答4:


You can do it like this:

setTimeout(printer, 1000, name)



回答5:


The correct way of passing a function reference is to use callbacks.

names.forEach(name => setTimeout(function() {
    printer(name);
}, 1000));

callbacks contains reference to the function.

setTimeout(callbackFunction, milliseconds);


来源:https://stackoverflow.com/questions/43317206/why-can-i-not-pass-a-function-call-rather-than-a-function-reference-or-an-anony

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!