2012-08-26 37 views
0

我有一些按鈕,我想以編程方式爲每個按鈕添加一個onclick函數。 我想要這些函數知道它們連接到哪個按鈕號碼,但我不想解析按鈕id以獲取數字。必須有一個更好的辦法:JavaScript範圍:如何創建具有不同值的匿名函數?

require(["dojo/dom", "dojo/domReady!", "dojo/on"], function(dom, domReady, on) { 
     for (var i = 0; i < 10; i++) { 
      on(dom.byId("button"+ i), "click", function(e) { 
       console.log("Number: "+ i); 
      }); 
     } 
    }); 

如何添加了一項功能,它正確的按鈕數量,輸出沒有這樣做:

console.log("Number: "+ e.srcElement.id.substring(6)); 
+0

check [this](http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part- 3 /),在循環內使用閉包。 –

回答

4

如何

for (var i = 0; i < 10; i++) { 
    on(dom.byId("button"+ i), "click", (function(number){ 
     return function(e) { 
      console.log("Number: "+ number); 
     }; 
    })(i)); 
} 
+0

謝謝,這是有效的!但爲什麼?括號在這種情況下做什麼? – anty

+1

我使用[IIFE](http://www.google.com/search?btnG=1&pws=0&q=Immediately-Invoked+Function+Expression)以'i'作爲參數返回一個函數,該函數使用'我'在循環中的那一點,所以關閉是創建'''而不是'我' – Musa

+0

謝謝,我不知道IIFE。這真的很有幫助! – anty

3

你可以通過dojo/_base/lang::partial實現相同:

require([ 
    "dojo/_base/lang", 
    "dojo/dom", 
    "dojo/on", 
    "dojo/domReady!" 
], function(
    lang, 
    dom, 
    on 
) { 

    var button_onClick = function(i, event) { 
     console.log("Number:", i); 
    } 

    for (var i = 1; i <= 3; i++) { 
     on(dom.byId("button" + i), "click", lang.partial(button_onClick, i)); 
    } 

});​ 

查看jsFiddle上的工作示例:http://jsfiddle.net/phusick/KhsXB/

+1

謝謝,這也可以。可悲的是,我不能接受這個問題的兩個答案。 – anty