在for循环中定义的变量对子功能(Javascript)不可见

时间:2018-08-23 16:52:49

标签: javascript

我以为我了解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();
}

4 个答案:

答案 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();

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

答案 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);
}

希望有帮助!