【发布时间】:2013-04-14 13:18:38
【问题描述】:
我正在尝试一些简单的 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
但这是生产中遵循的标准方式吗?还有什么可以做的?
【问题讨论】:
-
for 循环(及其作用域行为)与 OOP 有什么关系?
-
@Bergi umm 我认为当我们编写
for(int i=0;i<x;i++){}(比如 Java、C#、C++)时,我的范围仅限于for循环块。在 JavaScript 中似乎并非如此。 -
JavaScript(和许多其他语言)没有块范围。这与语言是否遵循某些 OOP 原则无关。
-
您也可以使用
map或forEach
标签: javascript for-loop global-variables scope design-patterns