Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
317 views
in Technique[技术] by (71.8m points)

javascript - 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!

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...