我以为我理解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
循环会更好。