This question already has answers here:
JavaScript closure inside loops – simple practical example
                                
                                    (44个回答)
                                
                        
                5年前关闭。
            
        

我正在尝试为第三者控件建立处理程序数组。内部所需的对象之一是回调处理程序。问题在于调用了allProvider(item),“ theValue”变量不再指向同一位置-它始终设置为分配给它的最后一个值。我真正想做的是在构建数组时立即评估“ theValue.name”,而不是稍后。目前,我愿意接受任何解决方案。谢谢

var handlers = [];
for(var i=0;i<myArray.length;i++){
    var theValue = myArray[i];
    handlers.push({
        name: myArray.name,
        allProvider: function(item){
            return "All "+ theValue.name; //This always == myArray[myArray.length - 1]
        }
    });
 }

最佳答案

您在那里有一个闭包-theValue是对父作用域变量的引用,并且到函数执行时,它指向它被分配给的最后一个值。

You need to break the closure。一种常见的模式是使用IIFE。

allProvider: (function(theValue) {
               return function(item) {
                 return "All "+ theValue.name;
               }
             })(theValue)

关于javascript - 构建匿名函数时预评估对象值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27894939/

10-12 13:49