javascript中变量的作用域

javascript中变量的作用域,javascript,Javascript,我有一些类似于以下内容的javascript代码: for (i = 0; i < numTimes; i++) { DoStuff(); } function DoStuff() { for (i = 0; i < 100; i++) { console.log(i); } } (i=0;i

我有一些类似于以下内容的javascript代码:

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


function DoStuff() {

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

  console.log(i);

}

}
(i=0;i{ DoStuff(); } 函数DoStuff(){ 对于(i=0;i<100;i++){ 控制台日志(i); } } 我发现第二次调用
DoStuff()
时,循环中
I
的值以1开头。我认为这是由于JS中变量作用域的工作方式。除了在
DoStuff()
函数中更改变量名之外,解决这个问题的最干净的方法是什么?有人能解释一下这个行为吗

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

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


function DoStuff() {

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

  console.log(i);

}

}
DoStuff(); } 函数DoStuff(){ 对于(变量i=0;i<100;i++){ 控制台日志(i); } }
使用var关键字。这将限制i的范围

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

Change
i=0
变量i=0示例:

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

function DoStuff() {
    for (var i = 0; i < 100; i++) {
        console.log(i);
    }
}
for(变量i=0;i
for
循环中的
变量前面放置一个
var

for (var i = 0; i < 3; i++) {
    console.log(i);
}
for(变量i=0;i<3;i++){
控制台日志(i);
}
用于(变量i=0;i

您应该用“var”声明迭代器变量。如果没有,则声明全局作用域变量

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

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

用于(var i=0;i在javascript中,任何未首先使用
var
关键字声明的变量都是全局变量。添加
var
关键字使其函数局部,即函数局部。javascript没有块作用域,因此,例如,如果您使用
var
内部和
if
块声明变量,则如果
块不是本地的,则它将是包含它的函数的本地。

要详细说明前面的答案

i=0
更改为
var i=0
将为您提供所需的行为。 其原因是,如果您在声明时不使用
var
,那么您就是在将其声明为全局变量,而使用
var
声明则会使其在定义的函数范围内处于局部状态。还应注意,在函数外部声明的变量,无论是否使用
var
,都将是全局变量


更多信息

如果不声明变量(即使用“var i;”或“var i=0;”),则会将其创建为全局变量,其作用域是整个程序。(这非常糟糕!)


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

看看这个:由于
i
已经存在于函数之外,更好的办法可能是使用不同的迭代器变量。现在发生的是
i
无论是否存在
var
关键字,都将在第二个循环中覆盖。
for(var i=0; i<100; i++){