web-dev-qa-db-ja.com

JavaScriptLHSおよびRHSルックアップ

私はカイルシンプソンによるJSの本、特にこのトピックを知らないの範囲と閉鎖を読んでいましたコンパイラスピーク

そこで彼らはLHSおよびRHSルックアップについて言及しています。私はこれらの2つの用語を理解できませんでした、誰かが私がそれらを実現するのを手伝ってくれるでしょうか?

18
ZIS

LHSルックアップは、変数が割り当て操作の左側に表示されたときに実行され、RHSルックアップは、変数が割り当て操作の右側に表示されたときに実行されます。

私はそれを次のように考えています:
lhsルックアップはコンテナルックアップです
rhsルックアップは値ルックアップです

13
Ahmed Eid

左側または右側の割り当てとは考えないでください。値をメモリに格納し、後で取得することと考えてください。

たとえば、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 )を宣言したので、値2aまたはa = 2に暗黙的に割り当てています。これはLHSルックアップと呼ばれます。 (値2aに割り当てます)、早送りすると、コンパイラはconsole.log( a + b)行に戻り、値ab(再び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ルックアップです。

6

私はそれを次のように考えています:lhsルックアップはコンテナルックアップですrhsルックアップは値ルックアップです

私はカイルシンプソンのアプローチがとても好きですが、この特定の簡単な説明は私に大声で明確なポイントをもたらしました。

「私が知る必要があることを伝えるだけで、それ以上は何もしない」と、深いレベルでよりよく理解するためにドリルダウンすることの間には、常にトレードがあります。

その深い理解は、トラブルを回避する方法、デバッグ方法、テストコードの記述方法、最適化およびリファクタリングに役立つ場合があります。

私は現在、カイルの執筆とオンライン教育をたくさん読んで見ていますが、彼は物事をうまく説明するためのコツを持っています。多くのインストラクターは、専門知識があり、速度を落とすのが難しいため、速すぎて人を失います。一方、基本的になりすぎると、話が面白くなくなり、ただ気を失ってしまいます。

4
Jack King

あなたが言及した同じ本からの簡単な例

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上記の例から-**

  1. c =(fooメソッドの戻り値を保持するコンテナー)
  2. a = 2(値2をメソッドに渡すと、コンパイラーはa = 2を割り当てます)
  3. b =

上記のコードスニペットから4 RHS

  1. foo(2)-値を取得するにはaの参照が必要です
  2. = a-bの値を取得するには、aの参照が必要です
  3. a-aの値を取得するには、aの参照が必要です
  4. b-bの値を取得するには、bの参照が必要です

編集:

4
Code-EZ

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();
3
HADI

または短い:

RHS-読み取りルックアップ用

LHS-書き込みルックアップ用

1
maleta