動図学JavaScript之:宣言昇格(Hoisting)
3148 ワード
背景
JSは言語設計の欠陥(工期が足りない?)のため、中には不思議な特性があり、初心者が出会った後、黒人の疑問符を満面にする可能性があります.今日紹介するのは、声明の向上(Hoisting)です.
もしあなたがJSの初心者であれば、
コンパイルフェーズ
JSエンジンが私たちのスクリプトを解析し始めると、最初のことは私たちのコードの変数にメモリを設定することです.このフェーズコードはまだ実行されていません.後のコード実行の準備をしているだけです.このフェーズはコンパイルフェーズです.
この段階の一部の仕事は、すべての宣言を見つけ、適切な役割ドメインで関連付けることです(役割ドメインに関する部分は後述します).
たとえば、
コンパイルフェーズでは、関数宣言と変数宣言の格納方法が異なります.
関数宣言の格納方法
関数宣言のストレージは、メモリに関数全体の参照が格納されます.(関数宣言と関数式の違いに注意)
次の図のコードは、関数
letとconstが宣言した変数の格納方法
変数の格納が違います.ES 6には、
var宣言変数の格納方法
コンパイルフェーズが完了しました.JSエンジンはコードを実行します.ファイルの上部に3つの
事前呼び出し関数
前述したように、コンパイルフェーズでは、関数宣言は関数全体の参照を格納するため、関数宣言の前に関数を呼び出すことができます.
var定義を事前に使用する変数
constとletで定義した変数を事前に使用
割り当て操作の続行
JSエンジンがコードを解釈し続けると、ある行に付与文があると解釈され、メモリの値がコードで定義された値に上書きされます.
(上図の番号は7ハ~)
まとめ
振り返ってみると:関数および変数は、コンパイル時に宣言部分をメモリに格納します.これは、宣言のアップグレードです(実行コンテキストの概念にも関連していますが、後述します) 関数宣言は関数全体の参照を格納し、 である.
分かりましたか?本文は作者動図学JavaScript之:宣言昇格(Hoisting)【本編】 動図学JS之:作用域チェーン(Scope Chain) 動図学JS之:イベントループ(Event Loop) 動図学JS之:JavaScriptエンジン 動図学JS之:プロトタイプ継承
参考資料 JavaScript Visualized Hoisting Temporal Dead Zone あなたの知らないJavaScript上巻
本文は公衆番号に先発する:コード力全開(codingonfire)
JSは言語設計の欠陥(工期が足りない?)のため、中には不思議な特性があり、初心者が出会った後、黒人の疑問符を満面にする可能性があります.今日紹介するのは、声明の向上(Hoisting)です.
もしあなたがJSの初心者であれば、
undefined
またはReferenceErrors
の間違いに遭遇することがありますが、声明の昇進が元凶になる可能性があります.
変数と関数をファイルの上部に置くとよく解釈されますが、表面的にはそう見えますが、事実はそうではありません.コンパイルフェーズ
JSエンジンが私たちのスクリプトを解析し始めると、最初のことは私たちのコードの変数にメモリを設定することです.このフェーズコードはまだ実行されていません.後のコード実行の準備をしているだけです.このフェーズはコンパイルフェーズです.
この段階の一部の仕事は、すべての宣言を見つけ、適切な役割ドメインで関連付けることです(役割ドメインに関する部分は後述します).
たとえば、
var a = 2;
JSエンジンは、var a;
とa = 2;
の2つの宣言と見なします.最初の定義宣言はコンパイルフェーズで行われ、2番目の付与宣言は
で実行フェーズを待機します.コンパイルフェーズでは、関数宣言と変数宣言の格納方法が異なります.
関数宣言の格納方法
関数宣言のストレージは、メモリに関数全体の参照が格納されます.(関数宣言と関数式の違いに注意)
次の図のコードは、関数
sum
の宣言を参照してください.letとconstが宣言した変数の格納方法
変数の格納が違います.ES 6には、
let
とconst
の2つの新しいキーワードが導入されています.この2つのキーワードで定義された変数は、uninitialized
の値が格納されています.var宣言変数の格納方法
var
で宣言された変数で、格納時のデフォルト値はundefined
実行フェーズコンパイルフェーズが完了しました.JSエンジンはコードを実行します.ファイルの上部に3つの
console.log
文を追加します.事前呼び出し関数
前述したように、コンパイルフェーズでは、関数宣言は関数全体の参照を格納するため、関数宣言の前に関数を呼び出すことができます.
var定義を事前に使用する変数
city
という変数を事前に使用すると、var
キーワード定義のデフォルト値undefined
が印刷されます.多くの場合、この行為は困惑します.あなたはその値がundefined
であることを望んでいないからです.constとletで定義した変数を事前に使用
var
の問題を解決するために、const
とlet
があり、定義された変数のデフォルト値uninitialized
に事前にアクセスすると、ReferenceError
が投げ出されます.この行為には覇気の名前があります.一時的なデッドゾーン(Temporal Dead Zone)です.つまり、この変数を初期化する前にアクセスできません.割り当て操作の続行
JSエンジンがコードを解釈し続けると、ある行に付与文があると解釈され、メモリの値がコードで定義された値に上書きされます.
(上図の番号は7ハ~)
まとめ
振り返ってみると:
var
宣言された変数はundefined
、let
およびconst
宣言された変数のデフォルト値はuninitialized
分かりましたか?本文は作者
Lydia Hallie
のシリーズの文章に翻訳して、一部の内容は詳しく説明して、以下は3編あって、公衆番号を購読して更新に注目することを歓迎します:参考資料
本文は公衆番号に先発する:コード力全開(codingonfire)
に注目して返信し、技術者の副業秘籍を取得する