循环索引变量的Javascript成为全局范围的一部分?

Ben*_*ack 6 javascript scope

也许我不知道for循环索引变量是如何得到作用域的,但是当我的一个循环没有完成时我感到非常惊讶,似乎因为在循环内调用的函数也包含了一个ifor 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');
Run Code Online (Sandbox Code Playgroud)

如果我在Chrome中运行它并查看控制台日志,我应该看到*****五次.但是,我只看过一次.经过进一步检查,如果我输入iChrome javascript控制台,它将输出6(= 'hello'.length + 1).这使我认为它i已成为全球范围的一部分,并不仅限于for需要它的循环范围.

它是否正确?如果是这样,for在javascript中定义循环的索引变量有什么更好的做法?

dec*_*eze 12

在Javascript中,变量的作用域是var关键字.声明变量时var,变量的范围限定为当前函数.在不使用var关键字的情况下分配给变量时,假设您正在讨论相同或更高范围内已定义的变量.如果未找到,则在最高范围内创建变量.

底线:使用声明所有变量var.


Jor*_*dão 8

您应该始终使用以下内容声明变量var:

for(var i = 0; i < test.length; i++) ...
Run Code Online (Sandbox Code Playgroud)