如何检查 `let` 变量是不是已在 ES6 上声明?

Posted

技术标签:

【中文标题】如何检查 `let` 变量是不是已在 ES6 上声明?【英文标题】:How can I check if a `let` variable has been declared on ES6?如何检查 `let` 变量是否已在 ES6 上声明? 【发布时间】:2015-09-11 14:42:45 【问题描述】:

与传统的 var 声明的变量不同,它们附加到整个封闭的函数范围,无论它们出现在哪里 - let 声明附加到块范围但 直到它们出现在块中才被初始化 em>

所以:

console.log( a ); // undefined
console.log( b ); // ReferenceError!

var a;
let b;

所以这里似乎没有应用提升。

问题

如果是这样,我怎样才能安全地检查变量是否已被声明?

NB - 我看到的选项是 try/catch,当然总是将 let 变量放在作用域的首位。但我的问题仍然存在

【问题讨论】:

您无法检查是否已声明任何变量(letvar)。您只能检查它们是否已被定义。你为什么要这样做呢?你的用例是什么? @AaditMShah 案例正在学习中。使用 var 我可以做到:if (typeof a ==='undefined') 编辑了我的评论。您正在做的是检查变量是否已定义。您没有检查它是否已被声明。 当它试图用let 做一些不打算做的事情时,它真的在学习吗?这是一个块范围,因此没有理由在该块之外检查它。 【参考方案1】:

这里好像没有使用提升。

不完全是。变量仍然覆盖整个作用域,在输入作用域时创建绑定,就像vars 一样。

但你是对的,与vars 相比,它不会立即用undefined 初始化,只有在评估let 语句时才会初始化。从范围顶部到那里的区域称为临时死区 - 标识符是绑定的,但在使用时总是会抛出ReferenceError

如何安全地检查变量是否已声明?

你不能,就像你不能 vars1。反正你不需要这个。

1:让我们忽略成为全局对象属性的全局变量2。 2:var/function/function*-声明的变量,我的意思是。词法绑定(letconst)确实不会成为全局属性。

【讨论】:

Bergi :恕我直言,var可以通过typeof 进行检查(除非它具有未定义的值var g=undefined)以及if ('x' in window)(对于全局 - 不适用于范围。) @RoyiNamir:不确定您的意思,也不知道您的用例是什么。如果变量不存在或具有值undefinedtypeof x 总是返回"undefined"。不管它是否被宣布。 你说:你不能,就像你不能为 vars 一样——我刚才提到我可以检查存在性 通过if ('a' in window) .. 的变量(但它仅适用于全局范围) @RoyiNamir:我以为你的意思是可以使用typeof【参考方案2】:

这将是最接近您正在寻找的东西:

try 
    console.log(typeof mima); // or any other use of variable
    let mima = 'no ni ma';
 catch (error) 
    console.log(error); // “Uncaught ReferenceError: mima is not defined(…)”

    // and then taking some actions regarding the situation

不过,它的用处还是值得商榷的。但如果我必须检查let'ed 变量,我会选择类似的东西。但是,请注意,您不能安全地使用 let 创建缺失变量,因为它被 catch 块包围。但它不会破坏代码。

【讨论】:

以上是关于如何检查 `let` 变量是不是已在 ES6 上声明?的主要内容,如果未能解决你的问题,请参考以下文章

初步接触ES6

ES6 之 let const

es6 转载

ES6开启 let关键字

ES6 学习笔记

《ES6标准入门》10~28Page let和const命令 变量的解构赋值