1

我正在尝试一些简单的 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这与面向对象概念中循环的循环变量的行为方式不是内联的(事实上它不需要,我知道) 。我知道我不应该尝试在任何方面将 JavaScript 与 OO 语言进行比较。但是我只是猜测 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

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

4

3 回答 3

2

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

是的。函数是在 JavaScript 中引入新作用域的唯一可能性(尽管在未来的版本中可能会改变let);IIFE也大量用于生产。

还有什么可以做的?

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

于 2013-04-14T13:27:26.277 回答
0

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

于 2013-04-14T13:26:58.793 回答
0

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

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

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”就没有真正的意义。

于 2013-04-14T14:40:50.953 回答