JS循环变量作用域



我正在尝试一些简单的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"就没有实际意义了。

相关内容

  • 没有找到相关文章

最新更新