Javascript 在循环中调用异步函数时避免重复创建函数

Javascript 在循环中调用异步函数时避免重复创建函数,javascript,asynchronous,Javascript,Asynchronous,有没有一种方法可以在不创建匿名函数10次的情况下执行以下操作?假设setTimeout只接受2个参数,回调和间隔。据我所知,你不应该在循环中创建函数,因为它很慢。但是,如果异步函数不允许您向其传递希望回调知道的参数,是否可以避免这样做?注意:我知道在Chrome中setTimeout需要更多参数,所以这不是一个理想的例子 function doSomethingAsync(i){ setTimeout(function() { //This anonymous function is c

有没有一种方法可以在不创建匿名函数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);
}
函数doSomethingAsync(i){
setTimeout(function(){//此匿名函数创建了10次
控制台日志(i);
}, 1000);
}
对于(变量i=0;i<10;i++){
doSomethingAsync(i);
}

简短回答-。如果您想匹配要映射回的每个迭代的值,则不需要,就像您在这里所做的那样。我不打算在这里评论性能,而是首先关注需求

如果您不关心映射到right call的值,那么您可以避免简单地创建函数

javascript引擎已经允许这样的情况。这将适用于不必定义多个匿名函数。这是通过向回调提供有关当前执行的更多信息来实现的,即
eventobject
。这就是DOM、XHR、HTML5文件API等交互的方式。因此,理想情况下,这意味着Javascript上下文之外的东西正在使用所需信息调用Javascript方法

浏览器或者更确切地说是JS引擎应该提供一种机制,为回调策略预定义一些排序
eventobject
,这样一个
函数可以处理所有
回调。顺便说一句,除了创建小函数闭包之外,目前还没有在JS中实现同样的功能的方法。所以我们得等到有消息了

希望这有助于阐明这一点


更新-刚刚看到问题说明,删除了不必要的代码。

简短回答-。如果您想匹配要映射回的每个迭代的值,则不需要,就像您在这里所做的那样。我不打算在这里评论性能,而是首先关注需求

如果您不关心映射到right call的值,那么您可以避免简单地创建函数

javascript引擎已经允许这样的情况。这将适用于不必定义多个匿名函数。这是通过向回调提供有关当前执行的更多信息来实现的,即
eventobject
。这就是DOM、XHR、HTML5文件API等交互的方式。因此,理想情况下,这意味着Javascript上下文之外的东西正在使用所需信息调用Javascript方法

浏览器或者更确切地说是JS引擎应该提供一种机制,为回调策略预定义一些排序
eventobject
,这样一个
函数可以处理所有
回调。顺便说一句,除了创建小函数闭包之外,目前还没有在JS中实现同样的功能的方法。所以我们得等到有消息了

希望这有助于阐明这一点


更新-刚刚看到关于问题的注释,删除了不必要的代码。

为了得到与您想要的相同的结果,我选择递归:

var i = 0; 
doSomethingAsync();
function doSomethingAsync()
{
i = i +1; 
console.log(i);
if (i<10) setTimeout(doSomethingAsync,500);
}
var i=0;
doSomethingAsync();
函数doSomethingAsync()
{
i=i+1;
控制台日志(i);

如果(i要得到您想要的相同结果,我会选择递归:

var i = 0; 
doSomethingAsync();
function doSomethingAsync()
{
i = i +1; 
console.log(i);
if (i<10) setTimeout(doSomethingAsync,500);
}
var i=0;
doSomethingAsync();
函数doSomethingAsync()
{
i=i+1;
控制台日志(i);

如果(i有一种方法可以绕过这个特定的例子,那么就使用它。我不打算讨论你是否应该使用它,但是

您可以这样重写您的示例:

function doSomethingAsync(i){
    setTimeout("console.log(" + i + ");", 1000);
}

for (var i = 0; i < 10; i++) {
    doSomethingAsync(i);
}
函数doSomethingAsync(i){
setTimeout(“console.log(“+i+”);”,1000);
}
对于(变量i=0;i<10;i++){
doSomethingAsync(i);
}

将字符串传递给setTimeout相当于在经过一段时间后对传入的字符串执行
eval()

在这个特定示例中有一种方法,使用。我不打算讨论您是否应该使用它,但是

您可以这样重写您的示例:

function doSomethingAsync(i){
    setTimeout("console.log(" + i + ");", 1000);
}

for (var i = 0; i < 10; i++) {
    doSomethingAsync(i);
}
函数doSomethingAsync(i){
setTimeout(“console.log(“+i+”);”,1000);
}
对于(变量i=0;i<10;i++){
doSomethingAsync(i);
}

将字符串传递给setTimeout相当于在经过一段时间后对传入的字符串执行
eval()

看看a,因为它可能会提供一些见解。您可以将参数转换为函数对象的属性。@mathielo这确实很有趣,但我仍然不清楚如何应用这个想法(尤其是因为对该答案的评论表明,如果您选择该路线,您将失去创建函数一次的好处).Well@AlexMA如果您不打算在IEs上运行代码,您可以试试这个。这不是最好的解决方案,因为它不是完全跨浏览器的,但在某些情况下可能会有所帮助。@mathielo我并不真正关心setTimeout,它只是一个“限制性”的示例异步函数。请看一看,因为它可能会为您提供一些见解。您可以将参数转换为函数对象的属性。@mathielo这确实很有趣,但我仍然不清楚如何应用这个想法(尤其是因为对该答案的评论表明,如果您选择该路线,您将失去创建函数一次的好处).Well@AlexMA如果您不打算在IEs上运行代码,您可以试试这个。这不是最好的解决方案,因为它不是完全跨浏览器的,但在某些情况下可能会有所帮助。@mathielo我并不真正关心setTimeout,它只是一个“限制性”异步函数的示例。