javascript クロージャーに関する記事をフォローしています。
実行コンテキストの詳細を知ろうとして、私は驚くべき結果に出くわしました。
var globalVar = 'g';
var inner;
var outer = function() {
var outerVar = 'o';
inner = function() {
var innerVar = 'i';
console.log(innerVar, outerVar, globalVar);
}
}
outer()
inner() // Q: What does this log out?
これは実際に出力しますi o g
。
私は見ると思っていましたi undefined g
。
これがプロセスの私の理解です。エラーを理解したい:
inner
グローバルオブジェクトのプロパティとして宣言され、値がに設定されますundefined
outer
が呼び出されます。outer
スコープ チェーンにouterVar
グローバル オブジェクトが含まれる実行コンテキストが作成されます。- グローバル オブジェクトのプロパティの値には
inner
、関数定義への参照が割り当てられます。 - 終了の実行コンテキスト
outer
。(関連するスコープは削除されていますか? GC 用にマークされていますか?) inner
が呼び出されます。innerVar
スコープ チェーンにグローバル オブジェクトが含まれる実行コンテキストが作成されます。outerVar
範囲内に見つかりません
outerVar
が定義されている理由を誰か説明してもらえますか?