我见过这样的代码,其中使用三元运算符来检查变量是否已声明,如果尚未声明则声明它。例如:
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”具有 block 作用域并防止重新声明。我不确定这将如何导致上述情况下的 ReferenceError 。有人能解释一下这里发生了什么吗?谢谢!
最佳答案
您遇到了名为 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 的评论以了解详细信息。
关于javascript - 使用 'let' 通过三元运算符声明变量时出现引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984367/