在Javascript中生成一系列不同的回调函数

时间:2011-07-29 13:18:20

标签: javascript ajax callback eval jquery-callback

我正在尝试生成一个回调函数数组,以便在jQuery UI对话框中使用

给出以下代码:

for(var x in methods)
{

  buttons[x] = function() {

            var method = methods[x];

            var data = $('#dialog_'+model+' form').serialize();
            data += '&form='+model;
            $.post(
                    $('#dialog_'+model+' form').attr('action')+'method/'+method+'/',
                    data,
                    function(r) {
                            handleFormReturn(r);   
                    },
                    'json'
            );
  };

}

调用时,函数显然会使用变量x的最后已知值而不是我需要的值。如何在不必使用eval()的情况下避免此问题?

也许我说这一切都错了但据我所知,不可能将参数传递给回调。

3 个答案:

答案 0 :(得分:1)

您需要在for循环的每次传递期间创建一个新的变量范围。这只能通过调用函数来完成。

function createButton(x) {
    buttons[x] = function () {
        var method = methods[x];
        var data = $('#dialog_' + model + ' form').serialize();
        data += '&form=' + model;
        $.post(
        $('#dialog_' + model + ' form').attr('action') + 'method/' + method + '/', data, function (r) {
            handleFormReturn(r);
        }, 'json');
    };
}
for (var x in methods) {
    createButton(x);
}

现在x函数引用的buttons[x]的值将是传递给createButton的值。

答案 1 :(得分:0)

patrick dw解决方案的即时功能版本:

for (var x in methods) {
    buttons[x] = (function (x) {
        return function () {
            /* ... x is local for this function ... */
        };
     })(x);
}

答案 2 :(得分:0)

您需要为方法数组中的每个元素创建一个闭包:

for(var x in methods) {

    buttons[x] = (function(x) {

        var method = methods[x];

        return function () {
            var data = $('#dialog_'+model+' form').serialize();
            data += '&form='+model;
            $.post(
                $('#dialog_'+model+' form').attr('action')+'method/'+method+'/',
                data,
                function(r) {
                        handleFormReturn(r);   
                },
                'json'
            );
        };
    })(x);
}