如何检查是否已在 ES6 上声明了 `let` 变量?
How can I check if a `let` variable has been declared on ES6?
不同于传统的 var 声明的变量,它们附加到整个封闭的函数范围,无论它们出现在哪里 — let
声明附加到块范围,但 直到它们出现才被初始化出现在街区
所以:
console.log( a ); // undefined
console.log( b ); // ReferenceError!
var a;
let b;
所以这里好像没有应用提升。
问题
如果是这样,我如何安全地检查变量是否已声明?
NB - 我看到的选项是 try/catch 并且当然总是将 let
变量放在作用域的第一位。但我的问题仍然存在
it seems that hoisting is not applied here.
不完全是。变量仍然覆盖整个范围,绑定是在输入范围时创建的,就像 var
s.
但你是对的,与 var
s 相比,它不会立即用 undefined
初始化,只有在评估 let
语句时才初始化。从范围顶部到那里的区域称为 临时死区 - 标识符已绑定,但在使用时总是会抛出 ReferenceError
。
How can I safely check if the variable has been declared?
你不能,就像你不能为 var
s1 一样。反正你不需要这个。
1: 让我们忽略成为全局对象属性的全局变量2。
2:var
/function
/function*
-声明的变量,我是说。词法绑定(let
、const
)确实不会成为全局属性。
这将是最接近您要查找的内容:
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
块包围。但它不会破坏密码。
不同于传统的 var 声明的变量,它们附加到整个封闭的函数范围,无论它们出现在哪里 — let
声明附加到块范围,但 直到它们出现才被初始化出现在街区
所以:
console.log( a ); // undefined
console.log( b ); // ReferenceError!
var a;
let b;
所以这里好像没有应用提升。
问题
如果是这样,我如何安全地检查变量是否已声明?
NB - 我看到的选项是 try/catch 并且当然总是将 let
变量放在作用域的第一位。但我的问题仍然存在
it seems that hoisting is not applied here.
不完全是。变量仍然覆盖整个范围,绑定是在输入范围时创建的,就像 var
s.
但你是对的,与 var
s 相比,它不会立即用 undefined
初始化,只有在评估 let
语句时才初始化。从范围顶部到那里的区域称为 临时死区 - 标识符已绑定,但在使用时总是会抛出 ReferenceError
。
How can I safely check if the variable has been declared?
你不能,就像你不能为 var
s1 一样。反正你不需要这个。
1: 让我们忽略成为全局对象属性的全局变量2。
2:var
/function
/function*
-声明的变量,我是说。词法绑定(let
、const
)确实不会成为全局属性。
这将是最接近您要查找的内容:
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
块包围。但它不会破坏密码。