2013-06-12 68 views
0

所以我的基本配置是這樣的:的Javascript給參數內部函數

for (var i = 0; i < 3; i++) { 
    var indices = [-1, -1, -1]; 
    while (index == -1) { 
     // Do Stuff 
     index[i] = newIndex; 
    }  
    var press = function() { alert(i); }; 
    new control({press: press});     
} 

現在,當我按下每個新的控件,而不是獲得的警報(0),警戒(1)和警報(2)我得到警報(3),警戒(3)和警報(3)。 我可以種明白怎麼回事。現在我的問題:我如何可以通過不同指數的功能我打算?

回答

3

這是因爲閉合可變i,該解決方案是創建用於每個循環的私人閉合。

for (var i = 0; i < 3; i++) { 
    var indices = [-1, -1, -1]; 
    while (index == -1) { 
     // Do Stuff 
     index[i] = newIndex; 
    }  
    var press = (function(myvar){ 
     return function() { alert(myvar); }; 
    })(i); 
    new control({press: press});     
} 
+1

爲了學習的目的,最好不要調用閉包參數'i',因爲它很混亂。恕我直言。 – gdoron

+1

@gdoron是的,你是對的 –

+0

感謝現在的工作:)。現在另一個問題實際上發生了什麼:(函數(a))(b)意味着b作爲參數傳遞....哦哇現在我自己得到它:這是一個匿名函數,它通過參數b?! – eclipse

1

使用封閉:

var press = (function (x) { 
    return function() { 
     alert(x); 
    }; 
})(i); 

這樣當前i值保存在一個安全的地方,一個私有函數。

請注意,在循環內聲明變量(使用var)不是標準的,您應該在循環之外聲明press變量。

相關問題