一時的なデッドゾーンの理由:
ES6
ブロック内にlet
andconst
文( )がある場合注意:let、const语句不存在变量提升
、これらのコマンドに対してこのブロックで宣言された変数は最初から閉じたスコープを形成することが明確に規定されています。宣言前にこれらの変数を使用すると、エラーが発生します。
例えば:
//场景一:
var a = 10;
function b() {
console.log(a);
let a = 20;
}
b(); // Uncaught ReferenceError: Cannot access 'a' before initialization 初始化前无法访问“a”
console.log(a);
関数 b で a を定義するために let があり、変数a が宣言される前に前の console.log(a); を使用すると一時的なデッド ゾーンが発生するため、ここではエラーが報告されます。
//场景二:
// TDZ开始
a = 'abc'; // ReferenceError
console.log(a); // ReferenceError
let a; // TDZ结束
console.log(a); // undefined
a = 123;
console.log(a); // 123
ここでエラーが報告されます。let
コマンドが変数を宣言する前はa
、変数はa
変数の「一時的なデッド ゾーン」に属しています。
//场景三:
let a = a // ReferenceError
上記のコードによって報告されるエラーも、一時的なデッド ゾーンが原因で発生します。宣言された変数を使用する場合let
、宣言が完了する前に変数が使用されている限り、エラーが報告されます。上の行はこの状況に属します。a
変数の宣言文が実行される前にa
値が取得されるため、エラーが発生します" Cannot access 'a' before initialization
"
拡張: 一時的なデッド ゾーンを引き起こすその他の現象:
let/const
キーワードが表示される前は、typeof
演算子は 100% 安全でしたが、今後は一時的なデッド ゾーンも発生します。キーワードがimport
パブリック モジュールを導入したり、 を使用したりnew
、class
クラスを作成したりする方法と同様に、一時的なデッド ゾーンも発生します。その理由は、変数の宣言と使用の順序
上記のキーワードとは逆にvar
、function
などのキーワードTDZ
は(一時的な不感帯)の影響を受けず、変数が共通化される前にアクセスされた場合は、undefined
変数昇格があるため結果が返されます。