为什么我需要在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的痛苦。