LHS与RHS查询(已完结)
LHS與RHS查詢
- 什么是LHS與RHS查詢
如果查找的目的是對變量進行賦值,那么就會使用LHS 查詢;如果目的是獲取變量的值,就會使用RHS 查詢
考慮以下代碼:
console.log(a);其中對a 的引用是一個RHS 引用,因為這里a 并沒有賦予任何值。相應地,需要查找并取得a 的值,這樣才能將值傳遞給console.log(..)
相比之下,例如:
a = 2;這里對a 的引用則是LHS 引用,因為實際上我們并不關心當前的值是什么,只是想要為=2 這個賦值操作找到一個目標。
考慮下面的程序,其中既有LHS 也有RHS 引用:
function foo(a) {console.log( a ); // 2}foo( 2 );最后一行foo(..) 函數的調用需要對foo 進行RHS 引用,意味著“去找到foo 的值,并把它給我”。并且(..) 意味著foo 的值需要被執行
代碼中隱式的a=2 操作可能很容易被你忽略掉。這個操作發生在2 被當作參數傳遞給foo(..) 函數時,2 會被分配給參數a。為了給參數a(隱式地)分配值,需要進行一次LHS 查詢。
這里還有對a 進行的RHS 引用, 并且將得到的值傳給了console.log(..)。console.log(..) 本身也需要一個引用才能執行,因此會對console 對象進行RHS 查詢,并且檢查得到的值中是否有一個叫作log 的方法。
這里不會再對log進行RHS查詢。因為對console查詢完畢后,對象屬性訪問規則會接管對log屬性的訪問。類似的——foo.bar.baz也是一樣的,對象屬性訪問規則會分別接管對bar 和baz 屬性的訪問
注意:在類似于var fun = function(){…}中,不會對右邊的式子進行RHS查詢,因為其本身就相當于一個值,這就類似于var fun = 2一樣
- LHS與RHS的差異
如果RHS 查詢在所有嵌套的作用域中遍尋不到所需的變量,引擎就會拋出ReferenceError異常
相較之下,當引擎執行LHS 查詢時,如果在頂層(全局作用域)中也無法找到目標變量,全局作用域中就會創建一個具有該名稱的變量,并將其返還給引擎,前提是程序運行在非“嚴格模式”下(嚴格模式下變量必須先聲明再賦值)。
考慮如下代碼:
function foo(a) {console.log( a + b );b = a;}foo( 2 );報錯:ReferenceError: b is not defined
‘b=a’不是變量聲明,預編譯過程中不會將其提前
- LHS與RHS查詢標識符的路徑
LHS 和RHS 查詢都會在當前執行作用域中開始,如果有需要(也就是說它們沒有找到所需的標識符),就會向上級作用域繼續查找目標標識符,這樣每次上升一級作用域,最后抵達全局作用域(頂層),無論找到或沒找到都將停止。
ps:本文參考并引用下列書籍
《你不知道的JavaScript》(上卷)
總結
以上是生活随笔為你收集整理的LHS与RHS查询(已完结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab simulink锂离子电池
- 下一篇: 线性表的顺序表示