javascript中变量的范围

时间:2011-07-06 17:28:52

标签: javascript

我有一些类似于此的javascript代码:

for (i = 0; i < numTimes; i++) {
   DoStuff();
}


function DoStuff() {

for (i = 0; i < 100; i++) {

  console.log(i);

}

}

我发现第二次调用DoStuff()时,循环中i的值从1开始。我认为这是由于变量的作用域在JS中的作用方式。除了更改DoStuff()函数中的变量名称之外,解决此问题的最简洁方法是什么,有人可以解释这种行为吗?

编辑:感谢您的回复。似乎JS具有“词法范围”而不是“块范围”。这是我在这看到的吗?有人可以解释新手术语中的词汇范围吗?

9 个答案:

答案 0 :(得分:1)

    for (var i = 0; i < numTimes; i++) {
   DoStuff();
}


function DoStuff() {

for (var i = 0; i < 100; i++) {

  console.log(i);

}

}

答案 1 :(得分:1)

在javascript中,任何未首先使用var关键字声明的变量都是全局变量。添加var关键字使其成为函数本地,这是函数的本地。 Javascript没有块作用域,所以如果你在var块内部和if块中声明了一个变量,它就不会是if块的本地变量,它将是本地的包含它的函数。

答案 2 :(得分:0)

使用var关键字。这将限制我的范围。

for (var i = 0; i < 100; i++)

答案 3 :(得分:0)

i = 0;更改为var i = 0;示例:

for (var i = 0; i < numTimes; i++) {
    DoStuff();
}

function DoStuff() {
    for (var i = 0; i < 100; i++) {
        console.log(i);
    }
}

答案 4 :(得分:0)

var放在for循环内的变量前面:

for (var i = 0; i < 3; i++) {
    console.log(i);
}

答案 5 :(得分:0)

for (var i = 0; i < numTimes; i++) {
   DoStuff();
}


function DoStuff() {

for (var i = 0; i < 100; i++) {

  console.log(i);

}

}

您应该使用“var”声明迭代器变量。如果不这样做,则声明全局范围变量

答案 6 :(得分:0)

您的i变量被隐式设置为全局级别,这意味着它可以在任何地方访问(并且可修改!)任何脚本。正如您刚刚发现的那样,这是一件坏事。解决方案是使用var关键字,它将变量限制为最近的封闭函数:

for(var i=0; i<100; i++){

答案 7 :(得分:0)

详细说明以前的答案,

i = 0更改为var i = 0会为您提供所需的行为。 这样做的原因是,如果你在没有var的情况下声明它将它声明为全局变量,而使用var声明它会使其定义在它所定义的函数范围内。它应该是另请注意,在函数外部声明的变量(包含或不包含var)都是全局变量。

更多信息here

答案 8 :(得分:0)

如果未声明变量(即使用“var i;”或“var i = 0;”),则将其创建为全局变量,其范围是整个程序。 (这很糟糕!)。

另请注意,JavaScript没有块作用域,因此如果在for循环中声明变量,它仍然具有整个函数的作用域。