2013-05-06 50 views
1

這個代碼看看:在JavaScript功能設定恆定

var arr = new Array(); 
for (var i = 0; i < 10; i++) { 
    arr[i] = { 
     func:function() { 
      console.log(i); 
     } 
    } 
} 
arr[0].func(); 

我爲此感到困惑,因爲我認爲這是可行的。我基本上希望數組中的每個對象都可以在創建函數時打印它給出的值

現在,當我打電話給func()時,它在控制檯中打印10。有沒有辦法讓它打印0, 1, 2, 3, 4, 5, 6, 7, 8, 9而不是?謝謝!

+0

是的,這是一個關閉問題。 – rsbarro 2013-05-06 02:10:53

+0

請*,請*,關閉此作爲重複.. – user2246674 2013-05-06 02:17:15

+0

另:http://stackoverflow.com/questions/3150010/strange-things-in-javascript-for – user2246674 2013-05-06 02:18:29

回答

1

問題是,裏面的函數引用了每次增加的變量'i'。你可以「我」在每個迭代的值存儲在沿着這樣的函數的對象:

http://jsfiddle.net/Sgnvp/

var arr = new Array(); 
for (var i = 0; i < 10; i++) { 
    arr[i] = { 
     func:function() { 
      console.log(this.value); 
     }, 
     value: i 
    } 
} 
arr[0].func(); 
0

你必須創建一個封閉封裝的價值。在這裏,我打電話consoleIt並通過它iconsoleIt周圍產生i

var arr = []; 

function consoleIt (i) { 
    return function() { 
     console.log(i); 
    } 
}; 

for (var i = 0; i < 10; i++) { 
    arr[i] = { 
     func: consoleIt(i) 
    }; 
} 

arr[0].func(); 
0

這是再好不過真的比thebreiflabb所採取的方式封閉,但它是一個有趣的技術是值得了解:

var arr = []; 

    for (var i = 0; i < 10; i++){ 

     (function(i){ 
     arr[i] = { 
      func : function(){ 
      console.log(i); 
      } 
     }; 
     })(i); 

    } 

    arr[0].func(); 

它只是使用了一個匿名閉包範圍我。