我正在尝试生成一个回调函数数组,以便在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()的情况下避免此问题?
也许我说这一切都错了但据我所知,不可能将参数传递给回调。
答案 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);
}