3

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

my_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)。

动态函数是否可以访问其范围之外但在其定义范围内的变量?

4

3 回答 3

6

您需要创建一个包含创建匿名函数时的值的闭包。您可以为此使用包装函数: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));
}
于 2012-02-07T00:32:17.080 回答
1

你需要的是Function.prototype.bind。使用它,您可以将函数绑定到某些参数。有了这些,您的代码将如下所示:

for(var i = 0; i < 10; i++) {

  var data = 'cannot modify this data';

  function callback(iValue, results, status) { alert(iValue); }
  my_function(data, callback.bind(null, i)); // |null| since you don't seem to need any specific |this|.

}
于 2012-02-07T19:37:06.163 回答
0
for(var i = 0; i < 10; i++) {

var data = 'cannot modify this data';

my_function(data, function (results, status) { 
 alert( 
  function(value){ 
    return value;
    }(i);
 )
}   //function (results, status)  ends here
);  // myfunction ends here..

}

没有测试过,但是..尝试一下..希望它有效..

检查此链接 - > Javascript 闭包 - 变量范围问题 ,以便更好地了解您在做什么。

于 2012-02-07T19:52:18.977 回答