2012-08-17 291 views
3

這裏是我的代碼:傳遞函數數組作爲參數

function test(e, f) { 
    for (var i = 0; i < e.length; i++) { 
     $('#clickme').append("<button id='op" + i + "'>" + e[i] + "</button>") 
     $('#op' + i).click(function() { 
      f[i](); 
     }) 
    } 
} 


$(function postPunk() { 
    var func1 = function() { 
     alert('1'); 
    } 
    var func2 = function() { 
     alert('2'); 
    } 
    var func3 = function() { 
     alert('3'); 
    } 
    test(['Option1', 'Option2', 'Option3'], [func1, func2, func3]); 
}) 

的點擊事件不會調用該函數。如果我在點擊事件中放置了一個警報測試,它會正常啓動。

任何想法爲什麼這不起作用?將函數數組作爲參數傳遞似乎是一個問題。有一個更好的方法嗎?

+2

不知道';'是可選在JavaScript中。你在第6行和最後一行錯過了它們。 – 2012-08-17 18:12:50

+0

你在控制檯上看着它嗎?有一個錯誤:'TypeError:[3]不是函數「f」+ [i]();' – 2012-08-17 18:12:56

+1

@WouterH and line 3. – 2012-08-17 18:13:48

回答

8

與此類型的其他問題一樣,i不斷變化。

相反,試試這個:

for(var i=0; i<e.length; i++) { 
    (function(i) { 
     // your code that depends on i not changing 
    })(i); 
} 
+0

你還不得不通過'f'嗎? http://jsfiddle.net/userdude/PKFRJ/ – 2012-08-17 18:19:34

+1

@JaredFarrish不要,因爲'f'不會像'i'那樣改變。 – 2012-08-17 18:20:08

+0

真夠了:http://jsfiddle.net/userdude/PKFRJ/1/ – 2012-08-17 18:21:10

4

這似乎是經典的JavaScript的問題,他們都成爲了最後的值(或undefined因爲f[3]不存在),因爲這是的i後的值循環。

嘗試將函數引用直接傳遞給click處理函數。

function test(e, f) { 
    for (var i = 0; i < e.length; i++) { 
     $('#clickme').append("<button id='op" + i + "'>" + e[i] + "</button>") 
     $('#op' + i).click(f[i]) 
    } 
} 

或者,另一種解決方案是使一個函數返回一個函數。這將使其「關閉」i左右。

function test(e, f) { 
    var makeFunc = function(i) { 
     return function() { 
      f[i](); 
     } 
    }; 
    for (var i = 0; i < e.length; i++) { 
     $('#clickme').append("<button id='op" + i + "'>" + e[i] + "</button>") 
     $('#op' + i).click(makeFunc(i)) 
    } 
} 
+2

+1將函數直接傳遞給'.click'。如果不需要「我」,這是唯一明智的解決方案。 – 2012-08-17 18:23:15

1

在回調函數的代碼使用循環結束後的的i值,所以它指向陣列外部的索引。您需要在環路閉合,使得每次迭代都有自己的變量如:

function test(e, f) { 
    for (var i = 0; i < e.length; i++) { 
      $('#clickme').append("<button id='op" + i + "'>" + e[i] + "</button>"); 
    (function(i){ 
     $('#op' + i).click(function() { 
          f[i](); 
        }); 
    })(i); 
    } 
} 
0

以下是我得到它的工作:http://jsfiddle.net/fH2Dk/3/

function test(e, f){  
    for(var i = 0; i < e.length; i++) { 
     (function(i) { 
      $('#clickme').append("<button id='op" + i + "'>" + e[i] + "</button>"); 
      $('#op' + i).click(function(){ 
       f[i](); 
      }); 
     })(i);  
    } 
}