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]);
})

点击事件不调用函数。如果我在 click 事件中放置一个警报测试,它会很好地触发。

任何想法为什么这不起作用?将函数数组作为参数传递似乎是一个问题。有一个更好的方法吗?

4

4 回答 4

8

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

相反,试试这个:

for( var i=0; i<e.length; i++) {
    (function(i) {
        // your code that depends on i not changing
    })(i);
}
于 2012-08-17T18:14:34.267 回答
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))
    }
}
于 2012-08-17T18:14:49.220 回答
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);
  }
}
于 2012-08-17T18:19:49.570 回答
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);    
    }
}
于 2012-08-17T18:22:06.850 回答