代码之家  ›  专栏  ›  技术社区  ›  pl61

使用“let”通过三元运算符声明变量时发生引用错误

  •  0
  • pl61  · 技术社区  · 6 年前

    我看到过一个代码,其中使用三元运算符检查是否声明了变量,如果没有声明,则声明它。例如:

    var num = (typeof num === 'undefined' ? 1 : num);
    console.log(num); //1
    

    但是,当使用“let”而不是“var”时,这不起作用:

    let num = (typeof num === 'undefined' ? 1 : num); //Uncaught ReferenceError: num is not defined
    

    我知道,与“var”相比,“let”具有块范围和阻止重新声明。我不确定这将如何导致上述案例中的引用错误。有人能解释一下这是怎么回事吗?谢谢!

    3 回复  |  直到 6 年前
        1
  •  3
  •   yqlim    6 年前

    你碰到一个叫 hoisting .

    起重影响 var 声明,但不是 let const .

    简而言之,起重每 var 代码顶部的声明。本规范的含义:

    x = 1;
    var y = x + x;
    var x;
    

    翻译为:

    var y;      // y is declared, but undefined (thus y === undefined)
    var x;      // x is declared, but undefined (thus x === undefined)
    x = 1;      // x is defined
    y = x + x   // y is defined
    

    这就是为什么你没有得到错误,因为 x 声明,然后定义。

    但事实并非如此 康斯特 :

    x = 1;
    let y = x + x;
    let x;
    

    将引发错误,因为您使用 X 在申报之前。

    编辑

    请阅读下面的Felix评论了解详细信息。

        2
  •  0
  •   YetAnotherBot    6 年前

    不是检查变量存在的最佳方法。您不应该通过访问变量来实现这一点。

    如果必须这样做,请使用:

    var barIsDeclared = true; 
    try{ bar; }
    catch(e) {
        if(e.name == "ReferenceError") {
            barIsDeclared = false;
        }
    }
    

    你得到 reference error 万一 const let 变量。可能在第一个迭代阶段没有提升它们,但这是 不是真的 .

    不管怎样,这就是我测试变量存在性的方法,它可以毫无问题地工作。

        3
  •  0
  •   Eduardo Gonzalez    6 年前

    您只是在初始化之前尝试访问它。

    let num;
    num = (typeof num === 'undefined' ? 1 : num);
    console.log(num); //1
    

    这是你真正想要的答案。