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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中的LHS和RHS查询

發布時間:2023/12/14 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript中的LHS和RHS查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章是本人大三期間的學習筆記,一些論斷取自書籍和網上博客,礙于當時的技術水平有一些寫得不夠好的地方,可以在評論處理智討論~

問題來源于《你不知道的JavaScript(上卷)》,文章部分論述截自原書。

簡述編譯原理


JavaScript通常會被歸類為“動態”或“解釋執行”語言,但事實上它是一門編譯語言。但與傳統的編譯語言不同,它不是提前編譯的,編譯結果也不能在分布式系統上進行移植

在傳統編譯語言的流程中,程序中的一段源代碼在執行前會經歷三個步驟,統稱為“編譯”。

  • 分詞 / 詞法分析
  • 解析 / 語法分析
  • 代碼生成
  • 與其他語言不同,JavaScript的編譯過程不是發生在構建之前的。對于JavaScript來說,大部分情況下編譯發生在代碼執行前的幾微秒(甚至更短)的時間內

    舉個栗子,var a = 2; JavaScript引擎會將它分為幾步完成呢?
    ??答案是兩步,JavaScript 會將其看成兩句聲明:var a; 和 a = 2;。第一個定義聲明在編譯階段進行,第二個賦值聲明會被留在原地等待執行階段。

    下面是原書對這句聲明的拆解分析:

    變量的賦值操作會執行兩個動作,首先編譯器會在當前作用域中聲明一個變量(如果之前沒有聲明過),然后在運行時引擎會在引用域中查找該變量,如果能夠找到就會對它賦值。

    而要講的LHS 和 RHS 就是上面說的對變量的兩種查找操作,查找的過程是由作用域(詞法作用域)進行協助,在編譯的第二步中執行。

    LHS 和 RHS


    LHS(Left-hand Side)引用和RHS(Right-hand Side)引用。通常是指等號(賦值運算)的左右邊的引用。
    我們來看下面這句代碼:

    console.log(a);

    這里對a的引用是一個RHS引用,因為這里a并沒有賦予任何值,我們只是想查找并取得a的值,然后將它打印出來。

    a = 2;

    這里對a的引用是一個LHS引用,因為我們并不關心當前的值是什么,只是想要為賦值操作找到目標。

    注:LHS和RHS的含義是“賦值操作的左側和右側”并不一定意味這就是"="的左側和右側。賦值操作還有其他幾種形式,因此在概念上最好將其理解為“賦值操作的目標是誰(LHS)”以及“誰是賦值操作的源頭(RHS)”。

    這里再舉一個較復雜的例子:(找出所有的LHS查詢和所有的RHS查詢

    function foo(a) {var b = a;return a + b; }var c = foo(2);

    這里一共有3個LHS查詢和4個RHS查詢,這里我們都來做個分析。

    LHS:

  • 第6行的 c = ...,c 在賦值操作的左邊,所以對 c 需要 LHS 查詢。
  • 隱藏著的 a = 2(隱式變量分配),在調用 foo(2) 時,需要將實參2賦值給形參a,所以對 a 需要 LHS 查詢。
  • 第2行的b = ..., 解釋同 1。
  • RHS:

  • 第6行的 c = foo(2),foo(2) 在賦值操作的右邊,需要知道 foo(2)的值,對 foo(2) 需要 RHS 查詢。
  • 第2行的b = a, a 在賦值操作的右邊,需要知道 a的值,對 a 需要 RHS 查詢。
  • 第3行的 reutrn a + b;, 需要知道 a 和 b 的值, 分別對 a 和 b 都進行 RHS 查詢。
  • 小結:如果查找的目的是對變量進行賦值,那么就會使用LHS查詢;
    ???如果目的是獲取變量的值,就會使用RHS查詢。

    區分 LHS 和 RHS 的重要性


    因為在變量還沒有聲明(在任何作用域中都無法找到該變量)情況下,這兩種查詢行為是不一樣的。

    LHS 和 RHS 查詢都會在當前執行作用域中開始,如果有需要(也就是說他們沒有找到所需的標識符),就會向上級作用域繼續查找目標標識符,這樣每次上升一次作用域,最后抵達全局作用域,無論找到或沒找到都將停止。

    借用書中的一張圖,將作用域鏈比喻成一個建筑,在對上面的論述進行一次轉換。
    (對作用域鏈的具體介紹可以移步 理解 JavaScript 的作用域鏈)

    這個建筑代表儲蓄中的嵌套作用域鏈。第一層樓代表當前的執行作用域,也就是你所在的位置。建筑的頂層代表全局作用域。

    LHS 和 RHS 引用都會在當前樓層進行查找,如果沒有找到,就會坐電梯前往上一層樓,如果還是沒有找到就繼續向上,以此類推。一旦抵達頂層(全局作用域),可能找到了你所需的變量,也可能沒找到,但無論如何查找過程都將停止。

    總結:不成功的RHS引用會導致拋出 ReferenceError 異常。不成功的LHS引用會導致自動隱式地創建一個全局變量非嚴格模式下),該變量使用LHS引用的目標作為標識符,或者拋出 ReferenceError 異常(嚴格模式下)。

    總結

    以上是生活随笔為你收集整理的JavaScript中的LHS和RHS查询的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 欧美精产国品一二三区 | 四虎永久网址 | 黑人多p混交群体交乱 | 天堂精品久久 | 国产高清自拍视频 | 岛国视频一区 | 亚洲痴女 | 手机在线看a | 成人第四色| 久久精品视频免费看 | 九九九九九精品 | 日本一区二区三区精品视频 | 日韩亚洲第一页 | 国产毛片一区二区三区 | 97超碰在 | 日韩激情网 | 成人蜜桃av | 国产破处av| 久久avav| 久草97 | 精品一区二区三区视频在线观看 | 手机av在线免费观看 | 亚洲国产精品尤物yw在线观看 | 毛片网站免费 | 亚洲影视一区二区 | 囯产精品久久久久久 | 偷拍亚洲视频 | 精品人妻久久久久久888不卡 | 疯狂少妇| 亚洲免费区| 人人干人人舔 | 亚洲av无码国产精品麻豆天美 | 在线色 | 人人干人人爱 | 亚洲激情影院 | 少妇伦子伦精品无吗 | 伊人网狼人 | 在线色资源| 69视频在线免费观看 | 欧美另类精品 | 午夜一区二区三区在线 | 高清欧美精品xxxxx在线看 | 欧美综合另类 | 日一区二区| 亚洲成av人片在线观看无 | 自拍视频一区二区 | 国产手机在线 | 亚洲熟女乱色综合亚洲小说 | 国产精品第九页 | 成人久久久精品乱码一区二区三区 | 午夜久久久精品 | 欧美综合亚洲 | 亚洲19p| 午夜在线精品 | 国产人妻777人伦精品hd | 久草免费在线观看 | 超碰免费av | 1000部啪啪未满十八勿入 | 99精品人妻少妇一区二区 | 国产精欧美一区二区三区蓝颜男同 | 91国产在线播放 | 亚洲黄色小视频 | 国产美女永久无遮挡 | 日韩免费高清视频网站 | 欧美黄色免费网站 | 一级黄色片在线 | 高清性爱视频 | 高级毛片 | 嫩草影院中文字幕 | 加勒比一区在线 | 人妻丰满熟妇无码区免费 | 不卡网av| 芭乐视频色 | 国产乱子一区二区 | 午夜免费av| 91视频日本| eeuss国产一区二区三区黑人 | 香蕉网站在线观看 | 欧美国产日韩在线 | 欧美日韩在线免费 | 精品少妇一区二区三区 | 成年午夜视频 | 好邻居韩国剧在线观看 | 中文字幕专区 | 69视频在线免费观看 | 国产性色av| 陪读偷伦初尝小说 | 在线观看911视频 | 综合精品一区 | 欧美日本免费 | 18岁毛片 | 欧美成人tv | 青青草逼 | 国产日韩欧美精品在线观看 | 最新视频–x99av | 91色九色 | 国产精品免费一区二区 | 91超碰人人 | 国产成人av一区二区 |