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
This is because of the order of execution. If you pass a function call to setTimeout, the function will be executed immediately, ie the function is put on javascript's execution stack immediately.
If you pass a function name, ie a reference to a function, the function is only put in the javascript thread's execution stack once the timer finishes.
您可以尝试以下方法:
setTimeout(function(){printer(name)}, 1000)
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
.
您可以这样做:
setTimeout(printer, 1000, name)
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);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.