javascript - 使用 'let' 通过三元运算符声明变量时出现引用错误

标签 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”具有 block 作用域并防止重新声明。我不确定这将如何导致上述情况下的 ReferenceError 。有人能解释一下这里发生了什么吗?谢谢!

最佳答案

您遇到了名为 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 的评论以了解详细信息。

关于javascript - 使用 'let' 通过三元运算符声明变量时出现引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984367/

相关文章:

php - 检测重定向的访客

javascript - Javascript 中的函数式循环与非函数式循环

javascript - 如何在 UI 控件中获取地形图 HERE Maps v3.1

javascript - 动态检查没有回发的asp net复选框

php - 如何使用 jQuery 计算输入字段的总成本?

javascript - JQuery 动画和效果通过 $.when() 和 then() 适用于多个元素

javascript - 无法让 'onChange' 在 IE 中的 <select> 标签下工作

javascript - 当用户仅向正确方向滑动轮播时如何触发事件

javascript - 如何将附加的 html 保存到文档中?

php - 脚本删除关键字后的文本