LHS与RHS查询(已完结)
LHS與RHS查詢
- 什么是LHS與RHS查詢
如果查找的目的是對(duì)變量進(jìn)行賦值,那么就會(huì)使用LHS 查詢;如果目的是獲取變量的值,就會(huì)使用RHS 查詢
考慮以下代碼:
console.log(a);其中對(duì)a 的引用是一個(gè)RHS 引用,因?yàn)檫@里a 并沒有賦予任何值。相應(yīng)地,需要查找并取得a 的值,這樣才能將值傳遞給console.log(..)
相比之下,例如:
a = 2;這里對(duì)a 的引用則是LHS 引用,因?yàn)閷?shí)際上我們并不關(guān)心當(dāng)前的值是什么,只是想要為=2 這個(gè)賦值操作找到一個(gè)目標(biāo)。
考慮下面的程序,其中既有LHS 也有RHS 引用:
function foo(a) {console.log( a ); // 2}foo( 2 );最后一行foo(..) 函數(shù)的調(diào)用需要對(duì)foo 進(jìn)行RHS 引用,意味著“去找到foo 的值,并把它給我”。并且(..) 意味著foo 的值需要被執(zhí)行
代碼中隱式的a=2 操作可能很容易被你忽略掉。這個(gè)操作發(fā)生在2 被當(dāng)作參數(shù)傳遞給foo(..) 函數(shù)時(shí),2 會(huì)被分配給參數(shù)a。為了給參數(shù)a(隱式地)分配值,需要進(jìn)行一次LHS 查詢。
這里還有對(duì)a 進(jìn)行的RHS 引用, 并且將得到的值傳給了console.log(..)。console.log(..) 本身也需要一個(gè)引用才能執(zhí)行,因此會(huì)對(duì)console 對(duì)象進(jìn)行RHS 查詢,并且檢查得到的值中是否有一個(gè)叫作log 的方法。
這里不會(huì)再對(duì)log進(jìn)行RHS查詢。因?yàn)閷?duì)console查詢完畢后,對(duì)象屬性訪問規(guī)則會(huì)接管對(duì)log屬性的訪問。類似的——foo.bar.baz也是一樣的,對(duì)象屬性訪問規(guī)則會(huì)分別接管對(duì)bar 和baz 屬性的訪問
注意:在類似于var fun = function(){…}中,不會(huì)對(duì)右邊的式子進(jìn)行RHS查詢,因?yàn)槠浔旧砭拖喈?dāng)于一個(gè)值,這就類似于var fun = 2一樣
- LHS與RHS的差異
如果RHS 查詢?cè)谒星短椎淖饔糜蛑斜閷げ坏剿璧淖兞?#xff0c;引擎就會(huì)拋出ReferenceError異常
相較之下,當(dāng)引擎執(zhí)行LHS 查詢時(shí),如果在頂層(全局作用域)中也無法找到目標(biāo)變量,全局作用域中就會(huì)創(chuàng)建一個(gè)具有該名稱的變量,并將其返還給引擎,前提是程序運(yùn)行在非“嚴(yán)格模式”下(嚴(yán)格模式下變量必須先聲明再賦值)。
考慮如下代碼:
function foo(a) {console.log( a + b );b = a;}foo( 2 );報(bào)錯(cuò):ReferenceError: b is not defined
‘b=a’不是變量聲明,預(yù)編譯過程中不會(huì)將其提前
- LHS與RHS查詢標(biāo)識(shí)符的路徑
LHS 和RHS 查詢都會(huì)在當(dāng)前執(zhí)行作用域中開始,如果有需要(也就是說它們沒有找到所需的標(biāo)識(shí)符),就會(huì)向上級(jí)作用域繼續(xù)查找目標(biāo)標(biāo)識(shí)符,這樣每次上升一級(jí)作用域,最后抵達(dá)全局作用域(頂層),無論找到或沒找到都將停止。
ps:本文參考并引用下列書籍
《你不知道的JavaScript》(上卷)
總結(jié)
以上是生活随笔為你收集整理的LHS与RHS查询(已完结)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab simulink锂离子电池
- 下一篇: python代码中的中文语法错误:Syn