分かりやすいLHSとRHS
2872 ワード
コードの一部が実行される前に、コンパイル段階があります.プログラムの処理に欠かせない人物はエンジン、コンパイラ、スコープです.JavaScriptは、プリコンパイル後にコードを実行すると、エンジンが照会し、LHS:Left-Hand-Side RHS:Right-Hand-Seideは、値付け操作の左側と右側に表示されます.例:
関数が他の関数にネストされている場合、すなわちスコープのネストです.現在のスコープで変数が見つからない場合、エンジンは外層ネストのスコープ内で検索を続けます.変数が見つかるか、または最外層のスコープに達するまで.
どのようにRHSとLHSを区別しますか?(1)RHSがすべてのネストの作用領域で必要な変数が見つからない場合、エンジンはReferenceErr異常を投げます.(2)LHSクエリを実行すると、グローバルスコープにも必要な変数が見つからない場合、1.プログラムが非厳格モードで実行されます.グローバルスコープはその名前の変数を作成して、エンジン2に戻します.プログラムは、厳格モードで実行されます.自動的または暗黙的にグローバル変数を作成することが禁止されていますので、エンジンはReferenceErr異常を投げます.
注:検索の目的が変数の割り当てである場合は、LHSクエリを使用して、検索の目的が変数の値を取得する場合は、RHSクエリを使用します.
function foo(a){
var b=a;
return a+b;
}
var c=foo(2);
上記の例では、Kyle Simpson先輩のように、私達は自分をエンジンとして機能領域に行って対話することができます.その後、LHSクエリは3箇所あります.それぞれa=2 c=...b=です.4箇所のRHSクエリはそれぞれfooです.(2.=a......b RHSクエリーは、変数の値LHSクエリを簡単に検索するのと同じです.変数のコンテナ自体を見つけて、値を賦課することができます.この例では、cの割当動作は、cをLHSクエリする必要があります.foo(2)には、RHSクエリを行って、値を取得する必要があります.fooは関数です.foa{}ここでは暗黙的な割当操作があり、aに対してLHSクエリを行い、作用領域にaという変数が存在するかどうかを判断し、存在すれば直接的にa=2を割り当てます.存在しません.(1)厳格なモードであれば、ReferenceErr:a is not defined.(2)を報告します.厳格なモードでない場合は、aのグローバル変数を作成し、直接にa=2を割り当てます.この関数のスコープ内では、var b=a;bに対してLHSクエリを行い、aに対してRHSクエリを行います.最終的なreturn a+b;それぞれaとbに対してRHSクエリを行う必要があります.関数が他の関数にネストされている場合、すなわちスコープのネストです.現在のスコープで変数が見つからない場合、エンジンは外層ネストのスコープ内で検索を続けます.変数が見つかるか、または最外層のスコープに達するまで.
function foo(c){
console.log(c+d);
}
var d=2;
foo(2);
上記の例を観察してみると、関数内部ではdをRHS参照できない場合、外に向かって検索を続け、グローバルスコープで完了することがわかった.どのようにRHSとLHSを区別しますか?(1)RHSがすべてのネストの作用領域で必要な変数が見つからない場合、エンジンはReferenceErr異常を投げます.(2)LHSクエリを実行すると、グローバルスコープにも必要な変数が見つからない場合、1.プログラムが非厳格モードで実行されます.グローバルスコープはその名前の変数を作成して、エンジン2に戻します.プログラムは、厳格モードで実行されます.自動的または暗黙的にグローバル変数を作成することが禁止されていますので、エンジンはReferenceErr異常を投げます.
注:検索の目的が変数の割り当てである場合は、LHSクエリを使用して、検索の目的が変数の値を取得する場合は、RHSクエリを使用します.