我有一些类似于此的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具有“词法范围”而不是“块范围”。这是我在这看到的吗?有人可以解释新手术语中的词汇范围吗?
答案 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循环中声明变量,它仍然具有整个函数的作用域。