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

时间:2011-05-18 01:31:58

标签: javascript scope

也许我不知道for循环索引变量是如何得到作用域的,但是当我的一个循环没有完成时我感到非常惊讶,似乎因为在循环中调用的函数包含{{ 1}}也用于i循环索引。

这是我用一个小脚本来证明这种行为:

for

如果我在Chrome中运行此操作并查看控制台日志,我应该看到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'); 五次。但是,我只看过一次。进一步检查后,如果我在Chrome javascript控制台中输入*****,则会输出6(i)。这使我认为= 'hello'.length + 1已成为全局范围的一部分,并不仅限于需要它的i循环的范围。

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

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:8)

您应该始终使用var声明变量:

for(var i = 0; i < test.length; i++) ...

答案 2 :(得分:4)

使用var声明变量时,将它们限定为当前执行上下文。

如果不这样做,它们将成为全局对象的属性(浏览器中为window)。