在 For 循环中的闭包中未定义
undefined in Closures In For Loops
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]);
相关文章:
- 为Google闭包类定义属性的首选方式是什么
- 在 For 循环中的闭包中未定义
- 节点 js 中的闭包未按预期工作
- 高级闭包兼容性和静态类型 - 使用未定义类型和全局函数,如localStorage.getItem();
- 闭包编译器 - 保留未使用的函数,不要重命名未定义的函数
- 仅在闭包中定义的模拟/存根对象
- Google闭包在高级模式下调用未定义的函数
- 为什么我必须在闭包中声明一个函数来访问闭包中定义的变量
- 无法创建闭包中定义的函数的对象
- 获得'未定义'使用闭包工具继承时出现属性错误
- 传递给闭包的角度参数未定义
- 为什么angular要使用闭包来定义指令和其他核心语法?
- 操作闭包中定义的变量
- 从外部(即定义闭包的作用域)访问闭包内部定义的var
- 为什么传入变量(作为ref)比访问闭包中定义的同一变量慢
- javascript回调闭包未定义变量
- 为什么JavaScript闭包返回未定义
- Javascript闭包未提供预期结果
- 闭包编译器警告来自外部的未定义属性
- Javascript闭包:动态定义函数,从当前作用域调用方法