为什么我需要在setTimeout中有匿名函数才能使这段代码正常工作?
我正在阅读Nodejs的教程,但我不明白这段代码,请给我解释一下。
function async(arg, callback) { console.log('do something with \''+arg+'\', return 1 sec later'); setTimeout(function() { callback(arg * 2); }, 1000); } function final() { console.log('Done', results); } var items = [ 1, 2, 3, 4, 5, 6 ]; var results = []; var running = 0; var limit = 2; function launcher() { while(running < limit && items.length > 0) { var item = items.shift(); async(item, function(result) { results.push(result); running--; if(items.length > 0) { launcher(); } else if(running == 0) { final(); } }); running++; } } launcher();
此代码产生运行2x,然后暂停一秒,然后再次运行2x,直到项目数组中没有项目。
但是,当我删除setTimeout中的匿名函数:
setTimeout(callback(arg*2), 1000);
然后代码运行停止任何第二。 为什么?
然后代码运行停止任何第二。 为什么?
因为不是将函数传递给setTimeout
,而是将函数调用的返回值传递给它。
函数调用立即执行,然后setTimeout
什么也不做返回值,因为它(大概)不是一个string或函数。
不要删除匿名函数包装器。
需要匿名委托的原因是因为setTimeout需要一个types为function
的对象作为第一个参数。
所以你可以直接给它一个预定义的函数名称:
function foo() { //do something } setTimeout(foo, 1000);
或者一个代表:
setTimeout(function(){/*dosomething*/}, 1000);
但是这个:
setTimeout(foo(param), 1000);
无效,因为在这种情况下,foo(param)在语义上是不正确的。
另一种方法是做类似的事情:
setTimeout("foo(param);", 1000);
因为setTimeout也会接受一个函数的string,但这是一个坏主意,因为你失去了当前的范围,这是一个debugging的痛苦。