JS循环变量范围

时间:2013-04-14 13:18:38

标签: javascript for-loop global-variables scope design-patterns

我正在尝试一些简单的JS代码。我知道我们应该使用var关键字在循环中声明一个循环变量说for循环以避免全局变量声明。但是我意识到循环变量在执行循环之后也存在:

var a = [1, 2, 3, 4, 5, 6];
for (var i = 0; i < a.length; i++)
    document.write(a[i]); //123456
document.write(i);  //6

这不是内联的(实际上它不需要,我知道),面向对象概念中的for循环的循环变量如何表现。我知道我不应该尝试将OO语言中的JavaScript与任何方面进行比较。但是我只是猜测OO语言中的行为更好。

我认为,如果我们将此代码直接放在<script>标记中,那么它实际上将循环变量添加到全局范围,这是不希望的。是这样的吗?或者我认为这是错误的方式?

我们可以通过创建显式函数范围来实现这种行为:

var a1 = [1, 2, 3, 4, 5, 6];
(function () {
    for (var i1 = 0; i1 < a.length; i1++)
        document.write(a[i1]); //123456
})();

document.write(i1);  //undefined

但这是生产中遵循的标准方式吗?还有什么可以做的?

3 个答案:

答案 0 :(得分:2)

  

我们可以通过创建显式函数范围来实现这种行为。但这是生产中遵循的标准方式吗?

是。函数是在JavaScript中引入新范围的唯一可能性(尽管在let}的未来版本中可能会有所改变;而IIFEs也大量用于生产。

  

还可以做些什么?

i的范围限制为for-loop的块?无(更不用说let)。但是,您几乎不需要这样做,因为没有任何东西会干扰它 - var i仍然是您的函数的本地范围。有时,您甚至可能希望在循环后使用i作为持续计数器。

答案 1 :(得分:0)

JavaScript只有function scope在边函数中使用var定义的任何变量仅在函数内可用。 for循环不会为变量创建任何范围。

答案 2 :(得分:0)

Javascript有点奇怪,恕我直言,有很多缺陷使它成为中/大项目的不良语言。

“var”表示该变量仅在当前函数范围内可用: 在运行函数之前,所有变量都在begening中定义并设置为“undefined”。 所以:

alert(i);
var i=4;
alert(i);
var i=5;
alert(i);

内部意思是:

var i=undefined;
alert(i);
i=4;
alert(i);
i=5;
alert(i);

在结构化编程中,所有代码都应该在函数中,这意味着“var”关键字将按预期工作。但是如果你在全局范围内编写代码,“var”就没有任何意义。