我对以下代码非常困惑:
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
答案 0 :(得分:6)
myFun
个函数都引用了相同的 t
(和y
)变量。因此,在循环之后,t
为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());
答案 1 :(得分: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])} ;
});