有没有办法在不创建10次匿名函数的情况下执行以下操作? 假设setTimeout只接受2个参数,回调和间隔。从我所听到的,你不应该在循环中创建函数,因为它很慢。但是,如果异步函数不允许您传递希望回调知道的参数,是否可以避免这样做?注意:我知道在Chrome中,setTimeout需要更多的参数,所以这不是一个理想的例子。
function doSomethingAsync(i){
setTimeout(function() { //This anonymous function is created 10 times
console.log(i);
}, 1000);
}
for (var i = 0; i < 10; i++) {
doSomethingAsync(i);
}
答案 0 :(得分:2)
简短回答 - 否。如果您想要将每个迭代的值匹配回来,就像您在这里所做的那样。我不打算对此处的表现发表评论,而是首先关注需求。
如果您不关心映射到右侧调用的值,那么您可以简单地避免创建函数
javascript引擎允许这样的情况。这适用于不必定义多个匿名函数。这是通过向回调提供关于当前执行的更多信息来实现的,即eventobject
。这就是DOM,XHR,HTML5文件API等的交互方式。所以这理想地意味着Javascript上下文之外的东西正在调用带有所需信息的Javascript方法。
浏览器或者说JS引擎应该提供一种机制来预先定义一些排序eventobject
用于回调策略,因此一个function
可以处理所有callbacks
。 AFAIK,除了创建小函数闭包之外,目前在JS本身没有相同的方法。所以我们要等到有消息传出来。
希望这有助于阐明它。
更新 - 刚看到问题的注释,删除了不必要的代码。
答案 1 :(得分:1)
为了得到你想要的相同结果,我会去递归:
var i = 0;
doSomethingAsync();
function doSomethingAsync()
{
i = i +1;
console.log(i);
if (i<10) setTimeout(doSomethingAsync,500);
}
答案 2 :(得分:1)
这个具体示例有一种方法,使用eval()
。我不打算辩论你是否应该使用它,但是......
您可以像这样重写您的示例:
function doSomethingAsync(i){
setTimeout("console.log(" + i + ");", 1000);
}
for (var i = 0; i < 10; i++) {
doSomethingAsync(i);
}
将字符串传递给setTimeout会在经过一段时间后传入的字符串上执行等效的eval()
。