在 Javascript 中生成不同回调函数的数组

发布于 2024-11-27 03:11:10 字数 673 浏览 1 评论 0原文

我正在尝试生成一组回调函数以在 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() ?

也许我的做法是错误的,但据我所知,不可能将参数传递给回调。

I'm trying to generate an array of callback functions for use in a jQuery UI dialog

Given the following code:

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

}

When called, the function will obviously use the last known value of the variable x and not the one that I need. How can I avoid this problem without having to resort to using eval() ?

Maybe I'm going about this all wrong but as far as I know it's not possible to pass a parameter to the callback.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

兰花执着 2024-12-04 03:11:10

您需要在 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);
}

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

You need to create a new variable scope during each pass in the for loop. This can only be done by invoking a function.

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

Now the value of x that the buttons[x] function refers to will be the one that was passed to createButton.

¢好甜 2024-12-04 03:11:10

patrick dw 解决方案的即时函数版本:

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

An immediate function version of patrick dw's solution:

for (var x in methods) {
    buttons[x] = (function (x) {
        return function () {
            /* ... x is local for this function ... */
        };
     })(x);
}
不乱于心 2024-12-04 03:11:10

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

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

You need to create a closure for each element in methods array:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文