【问题标题】:JavaScript let and var usageJavaScript let 和 var 用法
【发布时间】:2017-11-20 21:55:33
【问题描述】:

前段时间,我读了一些关于在 JavaScript 中使用 let 和 var 的文章,他们说你使用“var”关键字声明的变量(即使在 for 循环中)只能在它的函数中工作,那么为什么它可能在一个函数中创建多个 for 循环,每个循环看起来像:for (var i = 0; i < array.length; i++); 并且JavaScript对“重新声明” i 变量没有问题吗?谢谢:)

【问题讨论】:

  • JavaScript 允许重新声明使用var 声明的变量。
  • 您可能还想了解变量范围。
  • @4castle 这不是真的。你现在正在考虑重新分配。您可以更改使用let 分配的变量的值,但不能重新声明
  • @4castle 这意味着如果有更多的 for 循环, i 只是回到零并继续使用新值?我只是认为在 for 循环开始时声明的变量在循环中是有效的。
  • @Andrew 是的,你是对的。已编辑。 @Pollux var 有一种称为“提升”的特殊行为,如果变量声明出现在函数内部的任何位置,它就会被移动到函数的顶部。

标签: javascript function variables for-loop


【解决方案1】:

JS 对var 有一个特殊情况,因为它允许提升,这意味着允许对相同变量进行多次声明,并将它们移动到封闭的函数范围。但是,它们仍然是相同的变量。考虑以下代码:

function foo(){
 for(var i=0; i<3; i++){
  console.log("x");
 }
 for(var i;i<6;i++){
  console.log("y");
 }
}

foo()

请注意,在第二个循环中没有初始化 i,但它会正常执行并产生 3 个x 和 3 个y。这曾经是旧浏览器的问题,但新浏览器只是允许它并且没有给出错误。

【讨论】:

    【解决方案2】:

    一个看似很小的问题,却有着复杂的答案。 var 是旧的方法声明。您可以根据需要在任何地方多次声明它。 JavaScript 不会在意。所有声明的变量都可以立即使用,因为声明被移到函数代码的最开头。这称为提升。

    let 是声明变量的新方式。 const 存在,但我们现在对此不感兴趣。 let 是块作用域。 let 和范围界定背后的规则可能会令人困惑,但学习/理解是有利的。这是 JavaScript 的未来。我在我的博文here 中彻底讨论了它。

    【讨论】:

      【解决方案3】:

      let 赋予您声明变量的特权,这些变量的范围仅限于块,不同于 var 的表达式语句。

      var 是一个关键字,它在全局范围内定义一个变量,而不考虑块范围。

      【讨论】:

        【解决方案4】:

        ES6 引入 'let' 关键字只是为了解决这个问题。它允许将变量绑定到函数内的范围,这样您就无法在防止提升问题之外重新声明它。示例 -

        for(var i=0; i<5; i++) {
            console.log(i);
        }
        console.log(i);
        

        这里的输出将是 - 0 1 2 3 4 5 我们必须得到“未捕获的引用错误”而不是 5,因为变量 i 应该只能在函数内访问。由于 JavaScript 中的提升,所有变量和函数名称在执行前都存储在一个位置。所以代码实际上如下所示 -

        var i;
        for(i=0; i<5; i++) {
                console.log(i);
        }
        console.log(i);
        

        如果您使用 let 关键字,此问题将得到解决。

        【讨论】:

          猜你喜欢
          • 2020-09-29
          • 1970-01-01
          • 2020-06-02
          • 2018-05-14
          • 1970-01-01
          • 2022-12-01
          • 2016-04-05
          • 2018-06-08
          • 2018-12-09
          相关资源
          最近更新 更多