私はカイルシンプソンによるJSの本、特にこのトピックを知らないの範囲と閉鎖を読んでいましたコンパイラスピーク。
そこで彼らはLHSおよびRHSルックアップについて言及しています。私はこれらの2つの用語を理解できませんでした、誰かが私がそれらを実現するのを手伝ってくれるでしょうか?
LHSルックアップは、変数が割り当て操作の左側に表示されたときに実行され、RHSルックアップは、変数が割り当て操作の右側に表示されたときに実行されます。
私はそれを次のように考えています:
lhsルックアップはコンテナルックアップです
rhsルックアップは値ルックアップです
左側または右側の割り当てとは考えないでください。値をメモリに格納し、後で取得することと考えてください。
たとえば、chrome開発者コンソールでb
と入力すると、RHS
ルックアップが開始され(b
の値が取得されます)、値が見つからない場合はReferenceError
がスローされます。
対照的に、chrome開発者コンソールでb = 2
を入力すると、LHS
ルックアップが開始され、ネストされたスコープでbが見つからない場合、JSコンパイラはグローバルスコープでそれを宣言します(ユーザーがstrict mode
でコードを実行しているかどうか)。
たとえば、次のコードを考慮に入れてください
function foo(a) {
console.log( a + b)
}
foo( 2 );
JSコンパイラがコードを実行すると、最初に関数foo
が検索され、RHSルックアップと呼ばれる現在のスコープ(ここではホスティング環境)で宣言されているかどうかが検索されます。 fooのスコープでは、引数は2になり、foo(a)
を記述したときにfunctionfoo( 2 )
を宣言したので、値2
をa
またはa = 2
に暗黙的に割り当てています。これはLHS
ルックアップと呼ばれます。 (値2
をa
に割り当てます)、早送りすると、コンパイラはconsole.log( a + b)
行に戻り、値a
とb
(再びRHS
lookup)を探し、値が見つかった場合は、 console.log
引数(console.log
がホスティング環境でconsole.log(arg1)
として定義されていると仮定した場合、arg1 = value of a+b
(これもLHS
ルックアップです)。
要するに:
•エンジンが変数console.log(b)
の値を取得すると、b
のメモリ位置から値を取得します。これはRHS
ルックアップです
•エンジンが変数b = 2
に値を割り当てると、スコープ内のb
の値を検索します。見つかった場合はb
のメモリ位置に値2
を設定し、そうでない場合は上位レベルのスコープを検索します。これはLHS
ルックアップです。
私はそれを次のように考えています:lhsルックアップはコンテナルックアップですrhsルックアップは値ルックアップです
私はカイルシンプソンのアプローチがとても好きですが、この特定の簡単な説明は私に大声で明確なポイントをもたらしました。
「私が知る必要があることを伝えるだけで、それ以上は何もしない」と、深いレベルでよりよく理解するためにドリルダウンすることの間には、常にトレードがあります。
その深い理解は、トラブルを回避する方法、デバッグ方法、テストコードの記述方法、最適化およびリファクタリングに役立つ場合があります。
私は現在、カイルの執筆とオンライン教育をたくさん読んで見ていますが、彼は物事をうまく説明するためのコツを持っています。多くのインストラクターは、専門知識があり、速度を落とすのが難しいため、速すぎて人を失います。一方、基本的になりすぎると、話が面白くなくなり、ただ気を失ってしまいます。
あなたが言及した同じ本からの簡単な例
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
[〜#〜] lhs [〜#〜]:値(2)をfooメソッドに渡すと、コンパイラーはパラメーターにa = 2、として割り当てます。 LHSルックアップと呼ばれます。値を割り当てるためのコンテナ変数を見つけるだけです。
[〜#〜] rhs [〜#〜]:console.logを実行して印刷するにはa、aの値のRHS参照が必要です。それはRHSルックアップと呼ばれています
別の例
function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );
LHS上記の例から-**
上記のコードスニペットから4 RHS
編集:
LHS-目的を割り当てるため、またはそれに値を割り当てるための識別子を探します。
let foo;
// It's looking for foo identifier in global scope and assign value
// So it's an LHS
foo = 1;
// It's also LHS as it assigning new value
foo = 2;
さて、RHS-それはあなたがそれを使用するための識別子を探しているときを意味します(値を割り当てるためではありません)
function foo() {
alert(2);
}
// this look for an identifier called foo and
// in global scope it's a function decoration
// and execute it
foo();
または短い:
RHS-読み取りルックアップ用
LHS-書き込みルックアップ用