分配给新变量时,计数器值在循环中更改
Counter value changes within loop when assigned to a new variable
我正在学习JS。为什么日志记录funcs2[1]();
日志 4,funcs[1]();
日志 5?
请注意,这不是这个问题的重复。我知道funcs[1]();
记录5
(而不是 1),因为调用的函数绑定到 i
的当前值,当循环终止时为 5。
但这不是我的问题。我想知道为什么funcs2[1]();
日志 4 而不是 5。
var funcs = [];
for (var i = 0; i < 5; i++) {
funcs.push(function () {
return i;
});
}
console.log(funcs[1]());
5
var funcs2 = [];
for (var i = 0; i < 5; i++) {
var x = i;
funcs2.push(function () {
return x;
});
}
console.log(funcs2[1]());
4
由于 javascript 中没有块作用域,因此在两个循环都完成执行后,变量 i
的值在这两种情况下都是5
的。
但是,在第二种情况下,x
的值是4
的,因为这是最后一次迭代索引,i++
x = i
赋值后发生。
因为当 i 增加到 5 时,它不会进入循环,因此最终 x 为 4。
这是一个著名的 JS 闭包问题,内部函数仅将父上下文的变量对象保留在其内部 [[scope]]
属性中,而不是变量中。 因此,当循环完成时,父对象的 Vairable 对象中的i
等于 5,而 X 等于 4。
抱歉,我对原始帖子的编辑被拒绝了。 为了进一步讨论这个问题,我用另一个案例来回答:
var funcs3 = [];
function foo() {
for (var k = 0; k < 5; k++) { // k is in foo's scope
funcs3.push(function () {
return k;
});
}
}
foo(); // k can't be accessed after from here
console.log(funcs3[1]()); // 5, k is still in closure
相关文章:
- 如何在for循环中使用计数器
- 函数式编程 - 用于递增计数器的简单 for 循环
- 循环的Javascript中的PHP计数器
- 访问带有 for 循环中的计数器的数组
- alert-1,而不是循环中各自的计数器
- 使用{{render}}进行渲染时的循环计数器
- for 循环中 setInterval 中计数器变量 i 的作用域
- Javascript猜号游戏 - 设置计数器和while循环
- 将增量计数器连接到 JSON 响应循环中的数组选择器的末尾
- Javascript计数器控制循环使用(while)错误
- 在对象中查找值时,对于循环计数器
- 分配给新变量时,计数器值在循环中更改
- 计数器神秘地循环递增
- 如何创建一个计数器循环,该循环在单击提交按钮时启动,并输出多行单词,每个单词前面都有一个数字
- 启动和停止循环计数器 JavaScript
- 为什么嵌套的 Java 脚本循环具有相同的循环计数器名称
- 根据循环中的计数器创建具有唯一名称的 JavaScript 对象
- ajax调用的循环-访问循环计数器
- 函数调用中的循环计数器可视性
- 试图在do while循环中放入一个尝试计数器(Basic JavaScript)