コア要素
字句スコープは、書き込みコードであるか、そうでなければ定義を決定し、動的範囲は、実行時に決定されます。
レキシカルスコープのフォーカス機能場所の宣言、動的スコープ関数呼び出し注意。
字句スコープは、動的範囲はコールスタッククエリに基づいて、スコープチェーンクエリに基づいています。
Javascriptの唯一のレキシカルスコープ、これは結合が、動的スコープのようにされていません。
字句スコープ
Javascriptの実行を説明する前に呼び出された最初のステージをコンパイルし、コンパイルされる「字句技術。」
このプロセスでは、コンパイラは、ソースコードをスキャンし、語彙スコープチェーンを生成します。唯一の変数はレキシカルスコープを収集します宣言する/ constのは/ varキーワードを聞かせて使用します。
JSは、実際に言語をコンパイルしたが、先にコンパイルされていません。
VaRのA = 1は、実際には2つのステップである:変数宣言と変数の割り当て、コンパイラ字句スコープ相は、第1段エンジン行う字句スコープクエリ変数Aによれば、記載VAR aを収集し、その後= 1つの割り当てを行います。
クエリ結果の範囲を決定するための最良の方法は、変数のすべてを見ることであるので、最も重要な特徴は、そのレキシカルスコープ定義されたプロセスは、状態コードを書くことで発生されたソースコードは/ varがあるかどうかを定義で/ constの範囲のレベルを聞かせて。
スコープは、グローバルスコープ、スコープ機能を、字句スコープの階層のようなブロックレベルの範囲は、定義時に決定され、階層的です。
ルールのスコープは、内側層の外側の層にアクセスすることができず、内層へのアクセスです。
唯一の要因は、状態計算書であることを声明は、位置文は彼の時間の範囲とアクセスを決定レキシカルスコープケア機能。
コンパイルが完了した後に変更されることはありませんレキシカルスコープチェーンは、エンジンは、クエリの実行中に作成されたスコープチェーンの変数に基づいて行われます。
ダイナミックスコープ
ダイナミックスコープは彼らだけから呼び出す場所を気に声明を宣言する方法と同様の機能と範囲を気にしないでください。
スコープチェーンの動的範囲がコールスタックに基づいており、内部変数が見つからない場合、参照は、発信者を見つけるために、範囲のより高いレベルでのコールスタックに従います。
動的範囲は、異なる発信者不定とともに、変化しています。
ないこの動的範囲のように、ダイナミッククエリ範囲はコールスタックアップに基づいていますが、これはルールを特異的結合に係る結合ダイナミック(非クエリの処理)です。
let a = 2
function foo () {
// 由于遵守词法作用域,变量a的定义位置决定了它所在的foo作用域只能访问到全局作用域中的 let a = 2
// 如果遵守动态作用域,变量a的定义位置无所谓
console.log(a)
}
function bar () {
let a = 3
// 由于遵守词法作用域,foo中不能访问bar中的变量
// 如果遵守动态作用域,foo就会直接访问调用者bar中的变量
foo()
}
bar() // 2