【问题标题】:Variable scope in Javascript for loopJavascript for循环中的变量范围
【发布时间】:2009-04-26 09:35:06
【问题描述】:

两者有什么区别:

function bar()
{
  for (x=0; x< 100; x++) {}
}

和

function bar()
{
  var x;
  for (x=0; x< 100; x++) {}
}

如果 x 没有在该函数之外声明,那么它不是全局变量?我总是想知道这一点,因为我通常不会声明仅在循环中使用的一次性变量,但我想知道这是否会破坏浏览器等中的可比性。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    第一个示例将添加或修改全局变量 x,如果不是预期的结果,通常可以避免。

    虽然您的第二个示例按预期工作(无副作用),但我认为看起来更好的替代方案是

    function bar()
    {
      for (var x=0; x< 100; x++) {}
    }
    

    【讨论】:

    • 任何未用“var”声明的变量将始终是一个全局变量。这是 var 上的 MDC 条目:developer.mozilla.org/En/Core_JavaScript_1.5_Reference/…
    • 它可能看起来更好,但是 JavaScript 没有块作用域,因此无论您在 for 循环内部还是外部声明 x 都无关紧要。 (JS 1.7 引入了 let 关键字,请参阅 noha 的回答。)
    • +1 表示始终添加 var。我见过很多情况,其中一个循环使用'i'调用一个函数,它使用'i'调用一个具有自己循环的函数,其中两个都更新一个全局'i'。在某些情况下可能会被忽视,但在其他情况下会完全搞砸。
    【解决方案2】:

    变量在您声明/使用它时创建。如果省略 var 关键字,则变量会在全局范围内自动创建。所以你会产生副作用。这通常是要避免的。

    假设您使用全局变量,然后您选择了软件的其他部分已经使用的变量名称。这将导致代码片段覆盖其值的情况。这会产生错误,并且大多数时候很难调试。在您的示例中,您可能会覆盖另一个软件正在使用的全局变量 x。

    使用 var 也更快。如果您访问一个全局变量,它必须扫描所有范围直到全局变量名称。通过使用 var 它绑定到您的本地范围。

    始终使用 var 是一种很好的做法。或者更好:为变量选择最窄的范围总是好的。现在你有了 global 和 var。 var 声明在整个函数中都是可见的,无论你在哪里声明它。在 javascript 1.7 中引入了新的关键字:let。让我们进一步缩小范围。如果你用

    声明你的for循环
    for(let x = 0; x < 100; i++) {}
    

    x 仅在 {} 块内可见。

    【讨论】:

    • 现在大多数浏览器都是 1.7 吗?
    【解决方案3】:

    永远记住,在 JavaScript 中,作用域是由函数定义的。 在示例中

    function () {
        var x = 15;
        bar();
        function bar() {
          for (x=0; x< 100; x++) {}
        }
        //here x will be 100
    }
    

    您可能会意外访问更高的范围。我的意思是更高的范围是一个包装函数或 window.x(如果没有更多的包装函数)。如果您只想在循环中使用 x,最好坚持第二个示例。

    function () {
        var x = 15;
        bar();
        function bar() {
            var x;
            for (x=0; x< 100; x++) {}
        }
        //here x will be 15
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多