以下に、魅力的でシンプルな 2 行のコードを示します。しかし、(JS の下線原則を無視したためなど) 非常に混乱するか、慰められるかのどちらかであることは保証できます。
ただし、以下のような知識概念が完全にロードされています
私の矛盾した声明
var、const、let と同様に、それらのプロパティもホイストしますが、それらは異なるゾーンにあります。
ホイスティング Def (シンプル/素人版)
今度は、Js が 2 行のコードをコンパイルして実行する方法を詳しく説明します
JavaScript では、特に let と var を扱う場合、コンパイラーとエンジンが変数の宣言と代入を処理する方法が微妙に異なります。
指定されたコードのプロセスをコンパイラと実行の両方の観点から分析してみましょう:
name = 'ashu'; let name;
この時点で、JavaScript コードを作成すると、最初のパーサーとコンパイラーがコードをコンパイルしてから実行フェーズに入るということを明確にしています。
コンパイラーの視点
最初の行: name = 'ashu';
コンパイル段階中、
JavaScript エンジンはコードを解析し、必要なスコープを作成します。
割り当て名 = 'ashu';
が注目されますが、この段階ではエンジンはコードを実行しません。これは単に、name.
という名前の変数への代入の存在を記録するだけです。name が以前に宣言されていない場合、var 宣言はホイストされグローバルにアクセスできるため、コンパイラはそれをグローバル変数 (グローバル スコープ内の var name) への代入として扱います。
2 行目: let name;
コンパイラが let 名を検出したとき。宣言では、name がブロックスコープである必要があることが認識されています。
コンパイラ は、名前が属するスコープの一時デッド ゾーン (TDZ) に名前を配置します 。
つまり、名前の存在は認識しますが、それを初期化されていないものとしてマークします。
let 宣言は var.
と同じ方法ではホイストされません。代わりに、スコープ内にバインディングを作成し、宣言が実行されたときにのみ初期化します。
実行の視点
最初の行: name = 'ashu';
JavaScript エンジンが割り当て名 = 'ashu'; を実行するとき、
現在のスコープ内に名前が存在するかどうかをチェックします。 name は let で宣言されていますが、TDZ (Temporal Dead Zone) 内にあるため、 let 宣言が初期化される前にそれにアクセスしようとすると、ReferenceError が発生します。
したがって、この時点では、name は TDZ にあり、割り当て名 = 'ashu'; になります。 ReferenceError.
が発生します。2 行目: let name;
この行は、ブロック スコープ内の name 変数を 初期化します。
この時点以降、name は TDZ 内に存在しなくなり、エラーなしでアクセスまたは割り当てることができます。
今ならボーナスチップ
未宣言、未定義、初期化されていないの違い;
undeclare :- 変数はまだ宣言されていません。
未定義 :- 変数は宣言されていますが初期化されていません;
初期化されていない :- 変数は定義されていますが、その値は後の部分で表示されます。
例:- const result = multiplyBy2(5);
関数の戻り値が結果に割り当てられるまで、その時点までは初期化されていないゾーンになります。
興味深い事実:-
一時的なデッド ゾーンは最初は Const 用に装飾されていましたが、後の時点では **Let**
で採用されました。参照:-
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3