Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用let检查延迟声明的变量的ReferenceError?_Javascript_Ecmascript 6 - Fatal编程技术网

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
点创建新变量,并引用该点上方的外部变量。。。!