日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LHS与RHS查询(已完结)

發布時間:2023/12/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查询(已完结)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。