传递函数数组作为参数

问题描述:

这里是我的代码:传递函数数组作为参数

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

与此类型的其他问题一样,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

这似乎是经典的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

在回调函数的代码使用循环结束后的的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); 
    } 
} 

以下是我得到它的工作: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);  
    } 
}