[解決済み] 時間的不感帯とは何ですか?
質問
アクセスは
let
と
const
の値が初期化されないと
ReferenceError
というものがあるため
時間的不感地帯
.
テンポラリーデッドゾーンとは何か、スコープやホイストとどのような関係があるのか、どのような場面で遭遇するのか。
解決方法は?
let
と
const
とは大きく2つの違いがあります。
var
:
- それらは ブロックスコープ .
-
へのアクセスは
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
は、値が割り当てられる前は存在しないように見える。
しかし、そうではありません。
let
と
const
は
を掲げた(ような
var
,
class
と
function
) が、スコープに入ってから宣言されるまでの間に、アクセスできない期間があります。
この期間が時間的不感地帯(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)の徹底解説 .
関連
-
vueディレクティブv-bindの使用と注意点
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み】JavaScript版sleep()とは?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親子コンポーネント通信を解決する3つのVueスロット
-
要素ツリー制御によるvueTreeテーブル
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
Vueのクラススタイルの使い方の詳細
-
Vueのフォームイベントのデータバインディングの説明
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)