1. ホーム
  2. javascript

[解決済み] 時間的不感帯とは何ですか?

2022-04-16 05:56:50

質問

アクセスは letconst の値が初期化されないと ReferenceError というものがあるため 時間的不感地帯 .

テンポラリーデッドゾーンとは何か、スコープやホイストとどのような関係があるのか、どのような場面で遭遇するのか。

解決方法は?

letconst とは大きく2つの違いがあります。 var :

  1. それらは ブロックスコープ .
  2. へのアクセスは var が宣言される前に、その結果 undefined をアクセスする。 let または const を投げることが宣言される前に ReferenceError :

console.log(aVar); // undefined
console.log(aLet); // Causes ReferenceError: Cannot access 'aLet' before initialization

var aVar = 1;
let aLet = 2;

これらの例から、以下のように見えます。 let 宣言(および const とは限りません。 ホイスト というのは aLet は、値が割り当てられる前は存在しないように見える。

しかし、そうではありません。 letconst を掲げた(ような var , classfunction ) が、スコープに入ってから宣言されるまでの間に、アクセスできない期間があります。 この期間が時間的不感地帯(TDZ)である .

TDZが終了するのは aLet 宣言 よりも、むしろ 割り当て :

// console.log(aLet) // Would throw ReferenceError

let aLet;

console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

この例では let が吊り上げられる。

let x = "outer value";

(function() {
  // Start TDZ for x.
  console.log(x);
  let x = "inner value"; // Declaration ends TDZ for x.
}());

クレジット テンポラリーデッドゾーン(TDZ)の謎解き .

アクセス方法 x が内部スコープで発生します。 ReferenceError . もし let を表示します。 outer value .

TDZはバグを発見するのに役立つからです。宣言される前に値にアクセスすることは、ほとんど意図的ではありません。

TDZは、デフォルトの関数の引数にも適用されます。引数は左から右に評価され、各引数は代入されるまで TDZ 内にあります。

// b is in TDZ until its value is assigned.
function testDefaults(a = b, b) { }

testDefaults(undefined, 1); // Throws ReferenceError because the evaluation of a reads b before it has been evaluated.

でのTDZはデフォルトでは有効ではありません。 babel.js トランスパイラを使用します。で使用する場合は、quot;high compliance" モードをオンにしてください。 REPL . を供給します。 es6.spec.blockScoping フラグを使用することで、CLIやライブラリとして使用することができます。

さらに読むことをお勧めします。 TDZの謎解き ES6 Let、Constと「Temporal Dead Zone」(TDZ)の徹底解説 .