[ydkjsy]Scope & Closures-2-Illustrating Lexical Scope


文章

Marbles, and Buckets, and Bubbles... Oh My!



実はBLUEのstudent IDは暗黙のScopeであり、BLUEのScopeではない.
そしてここでは、スコフたちの間にも関係が含まれています.(赤(青(緑))また、ここでは色がアクセス可能ではなく、どこに宣言されているかに注意してください.(9行目、10行目を参照)
宣言されていない変数/識別子への参照は、現在または外部で可能ですが、逆にすることはできません.
通常、コンパイル中のほとんどの色が決定され、実行時に不要な検索を回避するために、各範囲への参照が格納されます.ただし、lookupをより容易に理解するために、実行時9行目の学生に非宣言の色がないと仮定します.まず、scopeに一致する名前があるかどうかを確認している場合は、その色を指定し、ない場合は外部scopeに移動して検索します.繰り返します.

A Conversation Among Friends


まずコンパイラを最大化します.
1.var studentsコンパイラは、scopeマネージャに特定のscopeと一致する状況があるかどうかを尋ね、コードを記述します.もしそうであれば、無視して宣言します.そうでなければ、実行時にscopeマネージャにこの範囲内で新しい変数を作成するように要求します.
2.コンパイラは、後でエンジン処理students = []に割り当てられるようにコードを生成する.エンジンが実行するコードは、まずscopeマネージャに尋ね、scopeにアクセスできる学生がいるかどうかを確認します.ない場合はエンジンが検索を続け、見つかった場合は参照配列が割り当てを完了します.
上を会話体に書くと.
Compiler:グローバルサービスマネージャ!私は学生を発表します.見たことがありますか.
グローバルマネージャ:いいえ、やりました.
Compiler:グローバルサービスマネージャ!私はgetStudentNameを発表します.見たことがありますか.
グローバルマネージャ:いいえ、やりました.
Compiler:スコフマネージャー!getStudentNameこの関数には新しいscopeが必要です.
Function Scope Manager:こちらです.
...
運転開始後
Engine:グローバルサービスマネージャ!始める前に、ここに関数を割り当てたいのですが、クエリーできますか?
(グローバル)Scope Manager:はい、変数があります.
エンジン:スコフマネージャー!私は学生の目標参照を見つけました.見たことがありますか.
(グローバル)Scope Manager:はい、Scopeにあります.ここです.
Engine:ああ、undefinedに初期化します.使う準備ができています.
ソースコードリファレンスgetStudentNameを見つけました.見たことがありますか.
(グローバル)Scope Manager:はい、Scopeにあります.ここです.
Engine:この値は関数です.実行する
Scope Managerは、この関数をインスタンス化する必要があります.

Nested Scope


スキャンごとにスキャンマネージャのインスタンスがあります.では、各スキャンプログラムは、変数反発と呼ばれる自動実行スキャンプログラムの上部にすべての識別子を登録します.この場合、関数宣言からの識別子は自動的に関連する関数参照に初期化され、var宣言からの識別子はlet/constとは異なりundefinedに初期化されます.また、その他の未初期化(TDZ)は、完全宣言-初期化を実行するまで使用できません.
コンサルティングの学生のためにプロセスを処理します.
Engine:関数Scopeマネージャ、参考源の学生を探したことがありますが、見たことがありますか.
(機能)Scope Manager:いいえ.外に出てみる
Engine:Global Scopeマネージャー、学生春?
(グローバル)Scope Manager:はい、こちらです.

Lookup Failures


エンジンがより多くの顕微鏡で確認できない場合、モードと変数の役割に依存してエラーが発生します.

Undefined Mess


変数がソースで、クエリーに失敗しました.ReferenceErrorを宣言しなかったとき
変数は、ターゲット、厳格モード、および非宣言モードとみなされます.ReferenceError.
is notdefinedとundefinedは違います.
前者は宣言そのものにならなかった.後者には変数がありますが、値はありません.
typeofならどちらも定義していません

Global... What!?


変数はターゲットです.非厳格モード.グローバルscopeマネージャは、変数の割り当てを完了するために突然グローバル変数を作成する可能性があります.
function getStudentName() {
    // assignment to an undeclared variable :(
    nextStudent = "Suzy";
}

getStudentName();

console.log(nextStudent);
// "Suzy" -- oops, an accidental-global variable!
Engine:関数スキャンマネージャ!nextStudentターゲット参照を見つけましたが、見たことがありますか?
(機能)Scope Manager:いいえ、外に出てみてください.
Engine:グローバルサービスマネージャ、見たことがありますか.
(グローバル)Scope Manager:いいえ、現在は厳密なモードではありませんので、グローバル変数を作成します.
厳格モード
(グローバル)Scope Manager:いいえ.ReferenceError