在JavaScript中,如何在创建时而不是在调用时使用变量的当前值创建匿名函数?

在JavaScript中,如何在创建时而不是在调用时使用变量的当前值创建匿名函数?,javascript,Javascript,在JavaScript中,在创建匿名函数时,使用变量的当前值创建匿名函数的最佳方法是什么 例如,当调用匿名函数时,此伪代码将在运行时使用currentObject值。因此,使用objects[i]时,它使用objects[](这是绝对正常的) for(var i=0;i

在JavaScript中,在创建匿名函数时,使用变量的当前值创建匿名函数的最佳方法是什么

例如,当调用匿名函数时,此伪代码将在运行时使用currentObject值。因此,使用objects[i]时,它使用objects[](这是绝对正常的)

for(var i=0;i
如何在没有eval()的情况下最好地实现此行为?

您可以尝试以下方法:

for (var i = 0 ; i < objects.length ; i++) {
    var currentObject = objects[i];
    foo.bind(currentObject.quux, (function(val) {
         return function() { bar(val); }
    })(currentObject.baz));
}
for(var i=0;i
您可以尝试以下方法:

for (var i = 0 ; i < objects.length ; i++) {
    var currentObject = objects[i];
    foo.bind(currentObject.quux, (function(val) {
         return function() { bar(val); }
    })(currentObject.baz));
}
for(var i=0;i
通常的解决方案是使用中间闭包来存储变量:

for (var i = 0 ; i < objects.length ; i++) {
    (function(currentObject){
      foo.bind(currentObject.quux, function() {
         bar(currentObject.baz);
      });
    })(objects[i]);
}
for(var i=0;i

在EcmaScript的下一个版本中,您还可以使用
let
,它与
var
相反,创建一个范围为块而不是函数调用的变量

通常的解决方案是使用中间闭包来存储变量:

for (var i = 0 ; i < objects.length ; i++) {
    (function(currentObject){
      foo.bind(currentObject.quux, function() {
         bar(currentObject.baz);
      });
    })(objects[i]);
}
for(var i=0;i
在EcmaScript的下一个版本中,您还可以使用
let
,它与
var
相反,创建一个范围为块而不是函数调用的变量

for(var i=0;i
for(变量i=0;i
注意:在我的生产代码中,我重构了逻辑,将objects数组存储在一个有用的变量中,并创建了一个更通用的匿名函数,该函数使用与qux匹配的参数来获取baz。但我对创建符合某些约束条件的匿名函数的最佳实践很感兴趣。闭包怪兽声称它每天都是受害者……开玩笑吧,你展示的“伪造”代码对我来说有点太假了。绑定
foo
是无用的,因为您不需要对生成的函数执行任何操作,而使用对象数组只是增加了一层复杂性,这与手头的问题无关,即为
调用定义适当的闭包。还有一个额外的结束括号在前一行。一些真正的代码会很酷。会很酷。由于答案使用foobar代码,所以保持问题的原样是有意义的。注意:在我的产品代码中,我重构了逻辑,将objects数组存储在一个有用的变量中,并创建了一个更通用的匿名函数,该函数使用与qux匹配的参数来获取baz。但我对创建符合某些约束条件的匿名函数的最佳实践很感兴趣。闭包怪兽声称它每天都是受害者……开玩笑吧,你展示的“伪造”代码对我来说有点太假了。绑定
foo
是无用的,因为您不需要对生成的函数执行任何操作,而使用对象数组只是增加了一层复杂性,这与手头的问题无关,即为
调用定义适当的闭包。还有一个额外的结束括号在前一行。一些真正的代码会很酷。会很酷。由于答案使用foobar代码,所以保持问题原样是有意义的