Javascript 将函数数组作为参数传递

Javascript 将函数数组作为参数传递,javascript,jquery,Javascript,Jquery,这是我的密码: 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](); }) } } $(f

这是我的密码:

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]);
})
功能测试(e,f){
对于(变量i=0;i
单击事件没有调用函数。如果我在click事件中放置了一个警报测试,它将正常启动


你知道为什么这样不行吗?将函数数组作为参数传递似乎有问题。有更好的方法吗?

与其他此类问题一样,
i
不断变化

相反,请尝试以下方法:

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

for(var i=0;i这似乎是经典的JavaScript问题,它们都是最后一个值(或者
未定义的
,因为
f[3]
不存在),因为这是循环后
i
的值

尝试将函数引用直接传递给
单击
处理程序

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) {
  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);
  }
}
功能测试(e,f){
对于(变量i=0;i
以下是我如何让它工作的:

功能测试(e,f){
对于(变量i=0;i
不知道
在javascript中是可选的。您在第6行和最后一行缺少它们。您正在控制台中查看它吗?有一个错误:
TypeError:[3]不是函数“f”+[i]();
检查上述问题。这可能会对您有所帮助。还有更多的“缺少”
(每个函数表达式)。它们是“可选的”,但最好不要忽略它们。@在JavaScript中的大多数地方,显式分号都是可选的(对于已经用每行一条语句干净地编写的代码)。这不会导致上述代码出现任何问题。请查找“ASI”(自动分号插入)对于规则。我在JavaScript中几乎不写分号;了解规则并保持一致。@JaredFarrish没有,因为
f
不会像
I
那样改变。+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);
  }
}
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);    
    }
}