我正在使用具有以下参数化(无法更改)的函数:
my_function(data, callback_function(results, status) {});
我需要将附加信息传递给 callback_function,这些信息不能添加到“data”(callback_function 使用)或“results”或“status”。具体来说,此信息是 my_function 调用所在的 for 循环的计数器。
为此,我在 callback_function 的主体中包含了对计数器的引用:
for(var i = 0; i < 10; i++) {
var data = 'cannot modify this data';
my_function(data, function (results, status) { alert(i); });
}
不幸的是,i 的最终值(在本例中为 9)被打印了 10 次。预期的行为是打印循环中 i 的每个值(0 到 9)。
动态函数是否可以访问其范围之外但在其定义范围内的变量?
最佳答案
您需要创建一个 closure包含 i
在创建匿名函数时的值。您可以为此使用包装函数:
function createClosure(x, func) {
return function(results, status) { func(x, results, status); }
}
/* ... */
for(var i = 0; i < 10; i++) {
var data = 'cannot modify this data';
my_function(data, createClosure(i, function(i, results, status) {
alert(i);
alert(results);
alert(status);
}));
}
或者如果你想短一点,你可以就地创建闭包:
for(var i = 0; i < 10; i++) {
var data = 'cannot modify this data';
my_function(data, (function(i) {
return function (results, status) {
alert(i);
}
})(i));
}
关于Javascript:将局部变量传递给动态创建的函数,该函数是另一个函数内的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169353/