循环索引变量的Javascript是否成为全局范围的一部分?
也许我不知道循环索引变量的Javascript是否成为全局范围的一部分?,javascript,scope,Javascript,Scope,也许我不知道for循环索引变量的作用域是如何确定的,但当我的一个循环没有完成时,我感到非常惊讶,似乎是因为从循环内调用的函数也包含了一个Ifor循环索引 下面是我为演示这种行为而编写的一个小脚本: var loopOne = function(test) { for(i = 0; i < test.length; i++) console.log(getMask(test)); }; var getMask = function(pass) {
for
循环索引变量的作用域是如何确定的,但当我的一个循环没有完成时,我感到非常惊讶,似乎是因为从循环内调用的函数也包含了一个I
for循环索引
下面是我为演示这种行为而编写的一个小脚本:
var loopOne = function(test) {
for(i = 0; i < test.length; i++)
console.log(getMask(test));
};
var getMask = function(pass) {
var s = "";
for (i = 0; i < pass.length; i++) {
s = s + "*";
}
return s;
};
loopOne('hello');
var loopOne=函数(测试){
对于(i=0;i
如果我在Chrome中运行它并查看控制台日志,我应该会看到五次。然而,我只见过一次。进一步检查后,如果我在Chrome javascript控制台中键入I
,它将输出6(='hello'.length+1
)。这使我认为i
已成为全局范围的一部分,并且不限于需要它的for
循环的范围
这是正确的吗?如果是这样,在javascript中为
循环定义索引变量的更好做法是什么?您应该始终使用var
声明变量:
for(var i = 0; i < test.length; i++) ...
for(var i=0;i
在Javascript中,变量的作用域是var
关键字。使用var
声明变量时,变量的作用域为当前函数。当在不使用var
关键字的情况下分配给变量时,假定您谈论的是相同或更高范围内已定义的变量。如果未找到,则在最高范围内创建变量
一句话:使用var
声明所有变量当使用var
声明变量时,将其范围限定到当前执行上下文
否则,它们将成为全局对象的属性(浏览器中的窗口)。“如果找不到任何属性,则会在最高范围内创建变量。”这很糟糕。感谢您对使用var
进行范围界定的解释。既然你提到了它,我就应该记住这一点。@Ben的确,这是Javascript的众多陷阱之一。AFAIK这在最新的ECMAScript规范中得到了纠正。我认为只有当您添加“使用严格的”
。请记住,javascript是一种简单易用的语言。它还需要支持闭包,因此分配给未声明的IDNetifier是合理的常见做法。因此,未声明的变量在第一次赋值时被添加到全局对象中,而不是之前。@Rob作为澄清补充了这一点。