在 for 循环中定义的变量,子函数 (Javascript) 不可见



我以为我理解Javascript的"闭包"行为,为了防止最复杂的问题,我通常在我所有的代码中使用"let"而不是"var"。但在这种情况下,这似乎还不够。

我在for循环中定义了一个变量(此处称为i以方便(。在我的循环中,我调用一个函数,该函数没有任何参数,在循环外的某个地方定义,它使用这个变量。但似乎它无法达到i的值,即使它存在于循环作用域中。

我知道,如果我在循环外i定义变量,或者如果我删除for行中的let变量,它将解决我的问题。问题是:为什么我的函数不知道i的值?

function printiValue()
{
alert(i);
}
let table = [1,2,3];
for (let i of table)
{
printiValue();
}

"let"本身的定义应该足够清楚:

"let 允许您声明范围仅限于使用它的块、语句或表达式的变量。这与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不管块范围如何。

给定该定义,您的 for 循环中的 let i 意味着它的作用域在该 for 循环内,但不在该循环中调用的函数内,除非它们作为参数传递。

如果您不相信/不理解,请运行以下命令:

function b() {
console.log(typeof i);
}
function a() {
let i = 10;
b();
}
a();

https://codepen.io/anon/pen/EeVPPB

您应该阅读此范围。

要使您的代码正常工作,请尝试以下操作:

function printiValue(param)
{
alert(param);
}
let table = [1,2,3];
for (let i of table)
{
printiValue(i);
}

你的函数是在 for 循环的范围之外声明的,所以它无法访问i值 您还使用了for of循环,该循环用于对象,而不是数组,您应该使用常规for循环。你可以

声明一个变量并在循环中递增它

let i = 0;
function printiValue()
{
alert(i);
}
let table = [1,2,3];
for (let j = 0; j < table.length; j++)
{
printiValue();
i++;
}

或传入 i 作为参数:

function printiValue(i)
{
alert(i);
}
let table = [1,2,3];
for (let i = 0; i < table.length; i++)
{
printiValue(i);
}

希望对您有所帮助!

因为let只是块宽。

在这种情况下,您必须在循环之前声明变量i,但forEach循环会更好。

最新更新