我写了一个简单的javascript代码。我的 for 循环迭代一个“let”声明的变量,i 介于 0 和 2 之间。仅当 i == 2 时,才会在循环中声明函数。该函数必须返回 i 变量的值。当我从循环外部调用此函数时,该函数返回 i = 2 的值(这对于 block 作用域变量 i 来说是很自然的。但是,当我将循环代码重写为其非循环等效代码块时,该函数(仍然从 block 外部调用)返回 i = 3 的值。发生了什么?
"use strict";
var printNumTwo;
for (let i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
console.log(printNumTwo()); //returns 2
// loop equivalent
{
let i = 0;
i = 1;
i = 2;
printNumTwo = function() {
return i;
}
i = 3;
}
console.log(printNumTwo()); // returns 3
最佳答案
你的例子很糟糕,因为你的循环在2之后不计数。所以如果你的循环看起来像 i <= 3
:
for (let i = 0; i <= 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
您将得到与非循环示例完全相同的结果,这是因为 javascript 中的闭包,但 return
中断 for 循环。您的函数正在从外部范围保存对该变量的引用。
关于javascript - 这是否适合我的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53958178/