Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环索引变量的Javascript是否成为全局范围的一部分?_Javascript_Scope - Fatal编程技术网

循环索引变量的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作为澄清补充了这一点。