我看过使用三元运算符检查变量是否已声明的代码,如果尚未声明,则对其进行声明。例如:
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。任何人都可以对这里发生的事情有所了解吗?谢谢!
答案 0 :(得分:3)
您遇到了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
然后再对其进行定义。
但是let
和const
并非如此:
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 error
和const
变量的情况下,您将获得let
。似乎它们在第一迭代阶段没有被吊起,但这是不正确。
无论如何,这就是我测试变量存在的方式,并且没有问题。
答案 2 :(得分:0)
您只是在尝试对其进行初始化之前对其进行访问。
let num;
num = (typeof num === 'undefined' ? 1 : num);
console.log(num); //1
这是您想要的实际答案。