2013-02-11 87 views
3

我對下面的代碼很困惑:對象函數循環覆蓋javascript?

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

只是單挑,for-in循環用於迭代對象中的成員。用於(var i = 0; i kimpettersen 2013-02-11 21:06:49

+1

實際的問題在於'console.log(y [t])',因爲函數中't'的值總是等於它最後的值(即1) – Mahn 2013-02-11 21:09:27

回答

6

myFun函數的所有引用相同t(和y)變量。所以循環後,t1,所以它總是返回第二個值。

你需要使用閉包「關閉」周圍的值(也,你不應該使用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()); 
+0

這是正確的答案。 – 2013-02-11 21:09:05

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])} ; 
}); 
+2

哎呀,你甚至可以用'v'代替'y [i]'。 – 2013-02-11 21:12:01

+1

@RocketHazmat對! 'v'將等於'y [i]'。 – Plynx 2013-02-11 21:13:31