在 For 循环中的闭包中未定义

undefined in Closures In For Loops

本文关键字:闭包 未定义 循环 For      更新时间:2023-09-26

var createShoutOuts = function(numbers_list){
  var shoutOuts = [];
  for (var j = 0; j < numbers_list.length; j++) {
    shoutOuts.push(function() {
      var shout_out = 'This is shout out number ' + (j+1);
      console.log(shout_out + '. The number is ' + numbers_list[j]);
    });		
  }
  return shoutOuts;
};
var performShoutOuts = function(user_numbers){
  var readyForShout = createShoutOuts(user_numbers);
  for (var i = 0; i < readyForShout.length; i++) {
    readyForShout[i]();
  };
};
performShoutOuts([2,4,8]);

我创建了上述内容来自学闭包。输出始终为:

"这是喊出4号。数字未定义'

我知道它总是会说数字 4,因为被推入 shoutOuts 数组的匿名函数引用了 j 变量,而不是 j 变量值的副本。因此,当 readyForShout[i](); 调用匿名函数时,for 循环已经运行并且 i 的值为 4。

我不明白的是为什么说未定义?因为在我看来,传递给performShoutOuts的数组应该存储在闭包中,因此在执行readyForShout[i]();时应该可以访问。

我错过了什么?

尝试使用真正的闭包:

var createShoutOuts = function(numbers_list){
  var shoutOuts = [];
  for (var j = 0; j < numbers_list.length; j++) {
    shoutOuts.push((function (j) {
      return function () {
        var shout_out = 'This is shout out number ' + (j+1);
        console.log(shout_out + '. The number is ' + numbers_list[j]);
      };
    })(j));
  }
  return shoutOuts;
};
var performShoutOuts = function(user_numbers){
  var readyForShout = createShoutOuts(user_numbers);
  for (var i = 0; i < readyForShout.length; i++) {
    readyForShout[i]();
  };
};
performShoutOuts([2,4,8]);