Javascript 使用let检查延迟声明的变量的ReferenceError?
我正在阅读关于Javascript 使用let检查延迟声明的变量的ReferenceError?,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在阅读关于let关键字的文章,并浏览了以下代码块: typeof对于时间死区(TDZ)变量的行为与对于未声明(或声明!)变量的行为不同。例如: { // `a` is not declared if (typeof a === "undefined") { console.log( "cool" ); } // `b` is declared, but in its TDZ if (typeof b === "undefined")
let
关键字的文章,并浏览了以下代码块:
typeof
对于时间死区(TDZ)变量的行为与对于未声明(或声明!)变量的行为不同。例如:
{
// `a` is not declared
if (typeof a === "undefined") {
console.log( "cool" );
}
// `b` is declared, but in its TDZ
if (typeof b === "undefined") { // ReferenceError!
// ..
}
// ..
let b;
}
那么如何检查它的类型,因为它总是给出ReferenceError?
我们是否需要使用尝试。。。catch
块作为typeof
的替代品
{
try {
console.log(typeof(b));
} catch (e) {
console.log(e);
}
let b;
}
最好的做法是在第一次使用变量的地方声明变量,或者在顶部声明变量
let b;
if (typeof b === "undefined") { //No ReferenceError!
// ..
}
因此,从TDZ中删除变量是最好的方法。在我们将首先使用变量的地方声明变量或在顶部声明变量始终是最好的做法
let b;
if (typeof b === "undefined") { //No ReferenceError!
// ..
}
所以,这是从TDZ中删除的最佳方法
那么,如何检查它的typeof
,因为它总是给出ReferenceError
你不能。在声明变量之前访问变量是一个编程错误
那么,如何检查它的typeof
,因为它总是给出ReferenceError
你不能。在声明变量之前访问变量是编程错误。来自文档:
在ECMAScript 2015中,let将把变量提升到块的顶部但是,在变量声明之前引用块中的变量会导致引用错误
。从块的开始到声明被处理,变量都处于“暂时死区”
因此,在您的代码中,您试图访问尚未声明的var。来自文档:
在ECMAScript 2015中,let将把变量提升到块的顶部但是,在变量声明之前引用块中的变量会导致引用错误
。从块的开始到声明被处理,变量都处于“暂时死区”
因此,在您的代码中,您试图访问尚未声明的var。因此理论上,TDZ变量没有typeof
?因此理论上,TDZ变量没有typeof
?这是非常意外的,因为通常typeof
可以用于安全地检查变量的存在。如果外部作用域中已经存在同名的变量,这就更令人意外了,因为在更下面的某个位置添加let
会突然使上面的代码中断,而我希望它只在let
点创建新变量,并引用该点上方的外部变量。。。!这是非常意外的,因为通常可以使用typeof
安全地检查变量的存在。如果外部作用域中已经存在同名的变量,这就更令人意外了,因为在更下面的某个位置添加let
会突然使上面的代码中断,而我希望它只在let
点创建新变量,并引用该点上方的外部变量。。。!