我正在尝试一些简单的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语言中的行为更好。
我认为,如果我们把这段代码直接放在<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
但这是生产中的标准方法吗?还有什么可以做的?
我们可以通过创建显式的函数作用域来实现这种行为。但这是生产中的标准方法吗?
是的。函数是在JavaScript中引入新作用域的唯一可能(尽管在let
的未来版本中可能会改变);
还有什么可以做的?
将i
的作用域限制在for循环的块上?没有(更不用说let
了)。但是,您几乎不需要这样做,因为没有任何东西会干扰它- var i
仍然是您的函数的局部作用域。有时,您甚至可能希望在循环之后使用i
作为正在进行的计数器。
JavaScript只有function scope
,任何在侧函数中使用var
定义的变量只能在函数内部可用。For循环不为变量创建任何作用域
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"就没有实际意义了。