3

我对以下代码感到非常困惑:

 var x =[ {name : 'name1' , value : 15 },{name :'name2' , value: 60} ];
 var y = [[1,2,3] , [4,5,6]] ; 
     for(var t in y){
         x[t].myFun = function(){console.log(y[t])} ;
      }
 console.log(x[0].myFun()) ; 

这段代码不应该返回第一个数组,y为什么它返回第二个数组?

这是一个jsFiddle

4

2 回答 2

6

这些myFun函数都引用相同 t的(and y) 变量。所以在循环之后,tis 1,所以它总是返回第二个值。

您需要使用闭包来“关闭”这些值(此外,您不应将for..in其用于数组):

var x = [{name : 'name1' , value : 15 }, {name :'name2' , value: 60}];
var y = [[1,2,3] , [4,5,6]]; 
for(var t = 0, len = y.length; t < len; t++){
    (function(t){
        x[t].myFun = function(){console.log(y[t])};
    })(t);
}

console.log(x[0].myFun()); 
于 2013-02-11T21:08:26.613 回答
5

由于您使用的是 JQuery,因此您有一个简单的方法来迭代数组,而无需担心在创建闭包时专门捕获索引的当前值。它是$.each

var x =[ {name : 'name1' , value : 15 },{name :'name2' , value: 60} ];
var y = [[1,2,3] , [4,5,6]] ; 
$.each(y, function(i,v)
{
    x[i].myFun = function(){console.log(y[i])} ;
});
于 2013-02-11T21:11:01.737 回答