国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS編譯之 LHS RHS(你不知道的JavaScript 小記一)

Cristic / 3329人閱讀

摘要:關于兩個專業術語的討論起自對你不知道的一書的閱讀學習。遇到,編譯器會詢問作用域是否已經有一個該名稱的變量存在于同一個作用域的集合中。摘錄來自你不知道的。

JS 編譯之 LHS RHS 一、前言

最近和朋友聊技術的時候,聊到 LHS RHS,我竟然沒聽說過 沒聽說過。。。 于是成功引起了我的好奇心。 關于兩個專業術語的討論起自對《你不知道的JavaScript》一書的閱讀學習。

二、編譯簡述

盡管通常將JavaScript歸類為“動態”或“解釋執行”語言,但事實上它是一門編譯語言。這個事實對你來說可能顯而易見,也可能你聞所未聞,取決于你接觸過多少編程語言,具有多少經驗。但與傳統的編譯語言不同,它不是提前編譯的,編譯結果也不能在分布式系統中進行移植。

盡管如此,JavaScript引擎進行編譯的步驟和傳統的編譯語言非常相似,在某些環節可能比預想的要復雜。

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

分詞/詞法分析(Tokenizing/Lexing)

解析/語法分析(Parsing)

代碼生成

比起那些編譯過程只有三個步驟的語言的編譯器,JavaScript引擎要復雜得多。例如,在語法分析和代碼生成階段有特定的步驟來對運行性能進行優化,包括對冗余元素進行優化等。

JavaScript引擎,編譯器概述

從頭到尾負責整個JavaScript程序的編譯及執行過程。

引擎的好朋友之一,負責語法分析及代碼生成等臟活累活。

摘錄來自: “你不知道的JavaScript(上卷)”

以上內容看起來有些高深,但是與下面內容并無多少關聯,只是背景,有興趣的可以深入研究一下。
對于下面的內容,我們只需要知道 JS代碼的執行需要JS引擎的,而JS引擎的在執行代碼前會先對其進行編譯(有些地方稱之為預解析),引擎最終執行的是經過編譯之后的代碼
LHS RHS 這兩個術語就是出現在引擎對變量進行查詢的時候,接下來看看在具體例子中 站在編譯器和引擎的角度看看它們是怎么思考工作的,以及這個過程中如何觸發了LHS RHS.

三、具體代碼的編譯執行過程中 如何觸發 LHS RHS

以書中的賦值語句為示例

var a = 2;

事實上編譯器會進行如下處理。

遇到var a,編譯器會詢問作用域是否已經有一個該名稱的變量存在于同一個作用域的集合中。如果是,編譯器會忽略該聲明,繼續進行編譯;否則它會要求作用域在當前作用域的集合中聲明一個新的變量,并命名為a。

接下來編譯器會為引擎生成運行時所需的代碼,這些代碼被用來處理a = 2這個賦值操作。引擎運行時會首先詢問作用域,在當前的作用域集合中是否存在一個叫作a的變量。如果是,引擎就會使用這個變量;如果不是,引擎會繼續查找該變量。

摘錄來自: 你不知道的JavaScript。

以上為書中描述,但是個人覺得可以補充一些描述如下

編譯器在編譯一段js代碼時,相當于對這段代碼進行預解析,為了引擎更好的進行二次解析。在預解析時,先構建好代碼的上下文環境,建立作用域鏈,在每個作用域中進行變量聲明提升和更特別的函數聲明提升。變量的聲明提升會在當前作用域的集合中聲明一個新的變量,如a。另外,在聲明每一個新的變量之前,編譯器會詢問作用域是否已經有一個該名稱的變量存在于同一個作用域的集合中, 如有則報錯。

   console.log(a)
   var a = 2;

的預解析之后,其實相當于

var a
console.log(a) // undefined
a = 2;

接下來編譯器會為引擎生成運行時所需的代碼,這些代碼被用來處理a = 2這個賦值操作。引擎運行時會首先詢問作用域,在當前的作用域集合中是否存在一個叫作a的變量。如果是,引擎就會使用這個變量;如果不是,引擎會沿作用域鏈繼續查找該變量;如果查到根作用域也沒有查到,會自動聲明a。

ps: 關于聲明提升,作用域鏈,如有疑惑,后續章節解釋。

上述過程中,第二步中編譯器生成了代碼,引擎執行它時(第3行 a = 2),會通過查找變量a來判斷它是否已聲明過。查找的過程由作用域進行協助,但是引擎執行怎樣的查找,會影響最終的查找結果。
此時引擎會就在對變量a進行LHS查詢,另外一個查詢的類型叫RHS。

四、LHS RHS 概念定義
我打賭你一定能猜到“L”和“R”的含義,它們分別代表左側和右側。
什么東西的左側和右側?是一個賦值操作的左側和右側。

換句話說,當變量出現在賦值操作的左側時進行LHS查詢,出現在右側時進行RHS查詢。

講得更準確一點,RHS查詢與簡單地查找某個變量的值別無二致,而LHS查詢則是試圖找到變量的容器本身,從而可以對其賦值。從這個角度說,RHS并不是真正意義上的“賦值操作的右側”,更準確地說是“非左側”。

你可以將RHS理解成retrieve his source value(取到它的源值),這意味著“得到某某的值”。

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

摘錄來自: 你不知道的JavaScript。

以上為書中解釋,以賦值操作符為標志,加上一些特殊情況的理解。但是我覺得可以有其他的理解方式。

五、LHS RHS 個人理解
講得更準確一點,RHS查詢與簡單地查找某個變量的值別無二致,而LHS查詢則是試圖找到變量的容器本身,從而可以對其賦值。

舉個例子來理解就是:RHS是找到你在哪個座位,看看你的樣子拍個照;LHS同樣是找到你在哪個座位,但是一眼不看直接踹飛 換個人坐這兒。
簡單來講有兩個區別:1.關不關心你現在的狀態 2.是否改變你的狀態(不管是改變一部分,還是完全改變)。

所以書中這句原話

是引擎執行怎樣的查找,會影響最終的查找結果。

我覺得可以反過來理解,正是因為查找結果的不同分出了兩種查找類型。

左側右側的分類理解更多是以 代碼的形態為標準分類的。個人覺得可以按查找目的為標準分類,RHS是為了讀取變量的值,LHS是為了改變變量的值。

六、總結

LHS RHS就是對變量查詢的兩種查詢類型,區別在于查詢的結果,或者說查詢的目的,在代碼上直觀體現為變量位置形態的不同。其中涉及的編譯器引擎工作過程,對于更深入的理解掌握js很有幫助。 其中個人理解有不合適的地方還請指正。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96096.html

相關文章

  • javascript作用域和閉包我見

    摘要:查詢是在作用域鏈中,一級級的往上查找該變量的引用。作用域和作用域鏈作用域的概念,應該兩張圖幾句話就能解釋吧。這個建筑代表程序中的嵌套作用域鏈。一層嵌一層的作用域形成了作用域鏈,變量在作用域鏈中的函數內得到了自己的定義。 javascript作用域和閉包之我見 看了《你不知道的JavaScript(上卷)》的第一部分——作用域和閉包,感受頗深,遂寫一篇讀書筆記加深印象。路過的大牛歡迎指點...

    SoapEye 評論0 收藏0
  • 讀書筆記-你不知道JavaScript(上)

    摘要:比如程序會被分解為解析語法分析將詞法單元流轉換成一個由元素逐級嵌套所組成的代表了程序語法接口的書,又稱抽象語法樹。代碼生成將抽象語法樹轉換為機器能夠識別的指令。 showImg(https://segmentfault.com/img/remote/1460000009682106?w=640&h=280); 本文首發在我的個人博客:http://muyunyun.cn/ 《你不知道的...

    jzzlee 評論0 收藏0
  • JS學習系列 01 - 編譯原理和作用域

    摘要:的抽象語法樹中可能如下圖所示代碼生成將轉換為可執行代碼的過程被稱為代碼生成。如果是,編譯器會忽略該聲明,繼續進行編譯,否則它會要求在當前作用域的集合中聲明一個新的變量,并命名為。 在學習 javascript 的過程中,我們第一步最應該了解和掌握的就是作用域,與之相關還有程序是怎么編譯的,變量是怎么查找的,js 引擎是什么,引擎和作用域的關系又是什么,這些是 javascript 這門...

    jkyin 評論0 收藏0
  • 快速理解JavaScript LHSRHS 查詢

    摘要:如果查找的目的是對變量進行賦值,就會使用查詢如果目的是獲取變量的值,就會用查詢。賦值操作會導致查詢。接下來,會查詢查詢變量并對其進行賦值。不成功的引用會導致拋出異常。 簡述編譯原理 JavaScript 程序中的一段源代碼在執行之前會經歷三個步驟,統稱為 編譯 分詞/詞法分析 解析/語法分析 代碼生成 先看原書對一個賦值操作的拆解說明: 變量的賦值操作會執行兩個動作,首先編譯器會...

    lemon 評論0 收藏0
  • 重讀你不知道JS (上) 第

    摘要:的抽象語法樹中可能會有一個叫作的頂級節點,接下來是一個叫作它的值是的子節點,以及一個叫作的子節點。值得注意的是,是非常重要的異常類型。嚴格模式下,未聲明的和倆者行為相同,都會是。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復雜微妙技術的語言,即使是經驗豐富的 JavaScript 開發者,如果...

    lk20150415 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<