我以为我了解Javascript的“关闭”行为,并且为了避免最复杂的问题,我通常在所有代码中使用“ let”而不是“ var”。但这似乎还不够。
我在for
循环中定义了一个变量(为方便起见,在此称为i
)。在我的循环中,我调用了一个函数,该函数在循环外部的某个位置没有定义任何参数,该函数使用此变量。但是,即使它存在于循环作用域中,它似乎也无法达到i
的值。
我知道,如果我在循环外定义变量i
,或者如果我在let
行中删除了for
,那将解决我的问题。问题是:为什么我的函数不知道i
的值?
function printiValue()
{
alert(i);
}
let table = [1,2,3];
for (let i of table)
{
printiValue();
}
答案 0 :(得分:0)
因为let
只是块宽。
在这种情况下,您必须在循环之前声明变量i
,但是最好使用forEach
循环。
答案 1 :(得分:0)
您应该阅读此scope。
要使代码正常工作,请尝试以下操作:
function printiValue(param)
{
alert(param);
}
let table = [1,2,3];
for (let i of table)
{
printiValue(i);
}
答案 2 :(得分:0)
“ let”本身的定义应该足够清楚:
“ let允许您声明范围限于使用它的块,语句或表达式的变量。这与var关键字不同,后者在全局范围内或整个函数本地定义变量,而与阻止范围。”
给出该定义,for循环中的let i表示其作用域位于该for循环内,但不在该循环内调用的函数内,除非将它们作为参数传递给它。
如果您不相信/理解,请运行此命令
function b() {
console.log(typeof i);
}
function a() {
let i = 10;
b();
}
a();
答案 3 :(得分:0)
您的函数在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);
}
希望有帮助!