繁体   English   中英

Javascript for循环中的变量范围

[英]Variable scope in Javascript for loop

有什么区别:

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

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

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

第一个例子将添加或修改全局变量x,如果不是所需的结果,通常要避免这种情况。

虽然你的第二个例子是按照需要工作的(没有副作用),但在我看来,这个替代方案看起来会更好

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

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

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

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

最好使用always use var。 或者更好:为变量选择最窄的范围总是好的。 现在你有全局和var。 无论您在何处声明,都可以在整个函数中看到var声明。 在javascript 1.7中引入了新关键字:let。 让我们进一步缩小范围。 如果你声明你的for循环

for(let x = 0; x < 100; i++) {}

比x仅在{}块内可见。

永远记住,在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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM