使用“ let”通过三元运算符声明变量时出现ReferenceError

时间:2018-12-31 06:36:36

标签: javascript

我看过使用三元运算符检查变量是否已声明的代码,如果尚未声明,则对其进行声明。例如:

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”具有块作用域并可以防止重新声明。我不确定在上述情况下这将如何导致ReferenceError。任何人都可以对这里发生的事情有所了解吗?谢谢!

3 个答案:

答案 0 :(得分:3)

您遇到了hoisting

起吊影响var声明,但不影响letconst

简而言之,提升将每个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然后再对其进行定义。

但是letconst并非如此:

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

将引发错误,因为您在声明之前使用了x

编辑

有关详细信息,请阅读下面的Felix评论。

答案 1 :(得分:0)

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

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

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

reference errorconst变量的情况下,您将获得let。似乎它们在第一迭代阶段没有被吊起,但这是不正确

无论如何,这就是我测试变量存在的方式,并且没有问题。

答案 2 :(得分:0)

您只是在尝试对其进行初始化之前对其进行访问。

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

这是您想要的实际答案。