[英]JavaScript LHS and RHS Lookup
我正在閱讀 Kyle Simpson 所著的 Scopes and Closure of You don't know JS 一書,特別是這個話題Compiler Speak 。
在那里他們提到了LHS 和 RHS 查找。 我無法理解這兩個術語,誰能幫我實現它們?
當變量出現在賦值操作的左側時進行 LHS 查找,當變量出現在賦值操作的右側時進行 RHS 查找。
我認為它如下:
lhs 查找是一個容器查找
rhs 查找是一個值查找
不要將其視為左側或右側的賦值,而是將其視為將值存儲到內存中並稍后檢索。
例如,當您在 chrome 開發人員控制台中鍵入b
時,它會啟動RHS
查找(檢索b
的值),如果未找到該值,則會拋出ReferenceError
。
相反,當您在 chrome 開發者控制台中鍵入b = 2
時,它會啟動LHS
查找,如果在嵌套作用域中找不到 b,則 JS 編譯器會在全局作用域中聲明它(取決於您是在strict mode
還是在strict mode
運行代碼)不是)。
例如考慮以下代碼
function foo(a) { console.log( a + b) } foo( 2 );
當 JS 編譯器執行代碼時,它首先查找函數foo
以及它是否在當前范圍(此處為托管環境)中聲明,這稱為 RHS 查找。 現在在 foo 的范圍內,參數將是 2 並且當我們在編寫foo( 2 )
時聲明函數foo(a)
foo( 2 )
我們隱式地將值2
分配給a
或a = 2
,這稱為LHS
查找(分配值2
到a
),現在快進編譯器將再次來到console.log( a + b)
,它將查找值a
和b
(再次RHS
查找),如果找到值,則將其分配給console.log
參數(如果您假設在托管環境中console.log
被定義為console.log(arg1)
則arg1 = value of a+b
(這也是LHS
查找)。
簡而言之:
• 當引擎檢索變量console.log(b)
的值時,它從b
的內存位置獲取值。 這是一個RHS
查找
• 當引擎將值賦給變量b = 2
,它在作用域中查找b
的值——如果找到,則在b
的內存位置中設置值2
,如果沒有,則在上層作用域中查找. 這是LHS
查找。
您提到的同一本書中的簡單示例
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
LHS :當您將 value(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 );
上例中的 3 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();
我認為它如下: lhs 查找是一個容器查找 rhs 查找是一個值查找
我非常喜歡凱爾辛普森的方法,但這個特別的簡明解釋讓我明白了這一點。
“只說我需要知道的,僅此而已”和深入了解以在更深層次上更好地理解之間總是需要權衡取舍。
有時,這種深刻的理解可以幫助您擺脫麻煩,如何調試、編寫測試代碼、優化和重構。
我目前正在閱讀和觀看凱爾的大量寫作和在線教學,他確實有很好的解釋能力。 很多講師在此過程中會失去一些人,要么因為他們有專業知識而走得太快,而且他們很難放慢腳步——另一方面,如果你太基礎了,談話就會變得無趣,你就會退出。
或簡短:
RHS - 用於讀取查找
LHS - 用於寫查找
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.