2013-02-11 88 views
2

我怎麼能執行一個功能而創建使用JavaScript如何在創建使用javascript的對象時執行函數?

對象運行下面的代碼

var y = [] ; 
var x = [[1,2,3] , [4,5,6] , [7,8,9]] 
for (var i = 0 ; i < 3 ; i++){ 
    y.push({name :'MyName' , value:function(){return x[i]} }) ; 
} 

console.log(y) ; 

會生成以下對象

{name : 'MyName' , value : function(){return x[i]} 

問題

怎麼能我執行這個對象函數:

{name : 'MyName' , value : function(){return [1,2,3]} 

我試圖eval()沒有工作

這裏是我的jsFiddle

對於誰問WHY的人都這樣做? 我這樣做是因爲對象將被值複製,所以我最終將所有我object.Value等於X [2];

+1

只是做:y [0] .value() – Dve 2013-02-11 17:12:43

+0

javascript會保持你的上下文,除非你覆蓋'x' – 2013-02-11 17:12:46

+0

我真的不明白,爲什麼你需要一個函數,爲什麼不只是'y .push({name:'MyName',value:x [i]});'? [Fiddle](http://jsfiddle.net/2Jb9D/1/) – adeneo 2013-02-11 17:17:18

回答

2

它是一個奇怪的代碼位。林不知道你想達到什麼。 但是,您遇到的問題是i在整個循環中遞增。所以當你最終調用函數時,i的值是3,因此超出了x陣列的範圍。 您可以修復它是這樣的:

var y = [] ; 
var x = [[1,2,3] , [4,5,6] , [7,8,9]] 
for (var i = 0 ; i < 3 ; i++){ 
    y.push({ 
     name :'MyName', 
     index: i, 
     value:function(){return x[this.index]; } 
    }) ; 
} 

console.log(y[0].value()); 

或者,如果你不明確需要一個函數來執行:

var y = [] ; 
var x = [[1,2,3] , [4,5,6] , [7,8,9]] 
for (var i = 0 ; i < 3 ; i++){ 
    y.push({ 
     name :'MyName', 
     value: x[i] 
    }) ; 
} 

console.log(y[0].value); 
+0

像索引和this.index AWESOME – 2013-02-11 17:29:54

0

對這些對象成功添加到陣列中,你需要創建在一個封閉y.push()語句。閉包將確保變量x [i]在被調用時可用於value()函數。

下面的代碼定義了'addItem()'函數,它關閉了創建自包含環境的對象的'value()'函數。這意味着即使在'addItem()'函數完成之後,'value()'函數仍然可以訪問在'addItem()'函數中定義或傳遞的變量。

var i = 0 
var y = [] ; 
var x = [[1,2,3] , [4,5,6] , [7,8,9]]; 

function addItem(item) { 
    y.push({ 
     name: 'MyName', 
     value: function() { 
      return item; 
     } 
    }); 
} 

for (; i < 3 ; i++) { 
    addItem(x[i]); 
} 

console.log(y); 
/* 
[ { name: 'MyName', value: [Function] }, 
    { name: 'MyName', value: [Function] }, 
    { name: 'MyName', value: [Function] } ] 
*/ 
console.log(y[0].value()); // [1, 2, 3] 
console.log(y[1].value()); // [4, 5, 6] 
console.log(y[2].value()); // [7, 8, 9] 

你也可以實現同樣的事情用在循環中的匿名函數,但我選擇不這樣做,因爲這會在每次繞到for循環的時間創造了一個新的功能。

相關問題