【问题标题】:JS loop variable scopeJS循环变量范围
【发布时间】: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 语言的行为更好。

我认为,如果我们将这段代码直接放在&lt;script&gt; 标记中,那么它实际上会将循环变量添加到全局范围,这是不需要的。是这样吗?还是我想错了?

我们可以通过创建明确的函数作用域来实现这样的行为:

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&lt;x;i++){}(比如 Java、C#、C++)时,我的范围仅限于 for 循环块。在 JavaScript 中似乎并非如此。
  • JavaScript(和许多其他语言)没有块范围。这与语言是否遵循某些 OOP 原则无关。
  • 您也可以使用mapforEach

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


【解决方案1】:

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

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

还有什么可以做的?

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

【讨论】:

  • 但这是否意味着每个for 都需要嵌套在函数范围内?
  • 没有。仅当您需要 i 在循环中明确限定范围时,但情况并非如此。
  • 修辞?可能是的,我试图把它整齐地框起来,但不仅仅是为了引起巨大的反响和点击。否则,每一个好的问题都将是一个修辞。在最初阅读之后,我通常会在浏览网络时找到与我阅读的旧主题相关的重要内容。所以只想检查我是否遗漏了什么。像 JS 这样非常灵活的语言很有可能,并且有专门针对所遵循模式的单独书籍。这个问题的答案可能是不,没有其他已知的方法或模式可以解决这个问题,但这仍然会增加我的理解的一些价值。
  • 也许我不明白你到底要什么其他东西。你已经知道闭包了吗(下一个与函数范围相关的事情)?如果没有,read on them
【解决方案2】:

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

【讨论】:

  • 是的,我知道,但是许多模式、实践演变为利用 JS 中的 OOP 甚至可以说使 JS 表现得像 OO 语言。只是想知道是否有任何标准/良好遵循的解决方法/模式可以将循环变量范围限定为循环块。
【解决方案3】:

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”就没有实际意义了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 2018-08-05
    • 1970-01-01
    • 2011-05-27
    • 2013-11-18
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多