Javascript:将局部变量传递给动态创建的函数,该函数是另一个函数内的参数

标签 javascript parameter-passing dynamic-function

我正在使用具有以下参数化(无法更改)的函数:

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/

相关文章:

javascript - 将带有 2 个参数的函数传递给 addEvent Listener 方法

c++ - 使用 C++ 和程序集在运行时分配和创建新函数

javascript - 如何动态改变js代码?

javascript - 如何反混淆这段 JavaScript 代码?

javascript - 如何定位 Highcharts 路径?

Javascript 函数编程——接收复杂的参数

javascript - react-router 和 react-router redux 有什么区别?

javascript - 在故事书 5.2 中使用装饰器包装故事 - typescript/Angular

java - 如何将变量传递给 BigInteger?