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

資訊專(zhuān)欄INFORMATION COLUMN

快速理解JavaScript 中的 LHS 和 RHS 查詢(xún)

lemon / 736人閱讀

摘要:如果查找的目的是對(duì)變量進(jìn)行賦值,就會(huì)使用查詢(xún)?nèi)绻康氖谦@取變量的值,就會(huì)用查詢(xún)。賦值操作會(huì)導(dǎo)致查詢(xún)。接下來(lái),會(huì)查詢(xún)查詢(xún)變量并對(duì)其進(jìn)行賦值。不成功的引用會(huì)導(dǎo)致拋出異常。

簡(jiǎn)述編譯原理

JavaScript 程序中的一段源代碼在執(zhí)行之前會(huì)經(jīng)歷三個(gè)步驟,統(tǒng)稱(chēng)為 編譯

分詞/詞法分析

解析/語(yǔ)法分析

代碼生成

先看原書(shū)對(duì)一個(gè)賦值操作的拆解說(shuō)明:

變量的賦值操作會(huì)執(zhí)行兩個(gè)動(dòng)作,首先編譯器會(huì)在當(dāng)前作用域中聲明一個(gè)變量(如果之前沒(méi)有聲明過(guò)),然后在運(yùn)行時(shí)引擎會(huì)在作用域中查找該變量,如果能夠找到就會(huì)對(duì)它賦值。 --- 《你不知道的JavaScript(上卷)》 P7

而要講的 LHSRHS 就是上面說(shuō)的對(duì)變量的兩種查找操作,查找的過(guò)程是由作用域(詞法作用域)進(jìn)行協(xié)助,在編譯的第二步中執(zhí)行。

LHS 和 RHS

字面意思其實(shí)是 Left Hand SideRight Hand Side 即左手邊和右手邊

一般可以理解為 賦值操作的左側(cè)和右側(cè)

先看個(gè)例子一
console.log(a);

這里對(duì) a 是一個(gè) RHS 引用,因?yàn)?a 并沒(méi)有賦予任何值,目的是為了取到 a 的值并打印出來(lái)。

a = 2;

這里對(duì) a 是一個(gè) LHS 引用,因?yàn)閷?shí)際上我們不關(guān)心當(dāng)前的值是什么,只是想要把 a 賦值為 2。

再看例子二
function foo(a) {
    console.log(a); // 2
}
foo(2);

最后一行foo(..)函數(shù)的調(diào)用需要對(duì) foo 進(jìn)行 RHS 引用,意味著是取到 foo 的值,并且 (..)意味著 foo 需要被執(zhí)行,因此它最好是一個(gè)函數(shù)類(lèi)型的值

其中有一個(gè)容易被忽略的隱式賦值操作 a = 2,它發(fā)生在 2 被當(dāng)做實(shí)參傳入 foo 中時(shí)。即實(shí)參 2 傳給了形參 a,需要一個(gè) LHS 查詢(xún)

console 那一行還有對(duì) a 的一次 RHS 引用(或者叫查詢(xún)),同時(shí)console.log(..)本身也需要一個(gè) RHS 引用,即對(duì) console 對(duì)象進(jìn)行 RHS 查詢(xún),并且檢查得到的值中是否有一個(gè)叫做 log 的方法。

書(shū)中有一段引擎和作用域的對(duì)話(huà),有助于很好的理解例子二,see YDKJS github

小測(cè)驗(yàn)
function foo(a) {
    var b = a;
    return a + b;
}
var c = foo(2);

試試找出其中的3處 LHS 查詢(xún),4處 RHS 查詢(xún)

答案

LHS 查詢(xún):

c = ..;

a = 2(隱式變量分配)

b = ..

RHS 查詢(xún)

foo(2..

= a;

a ..

.. b

小結(jié)

參考原書(shū)中文版P12,英文版見(jiàn) github

作用域是一套規(guī)則,用于確定在何處以及如何查找變量(標(biāo)識(shí)符)。

如果查找的目的是對(duì)變量進(jìn)行賦值,就會(huì)使用 LHS 查詢(xún);如果目的是獲取變量的值,就會(huì)用 RHS 查詢(xún)。

賦值操作會(huì)導(dǎo)致 LHS 查詢(xún)。 = 操作符或調(diào)用函數(shù)時(shí)傳入?yún)?shù)的操作都會(huì)導(dǎo)致關(guān)聯(lián)作用域的賦值操作, 即都會(huì)導(dǎo)致 LHS 查詢(xún)。

JavaScript 引擎首先會(huì)在代碼執(zhí)行前對(duì)其進(jìn)行編譯,在這個(gè)過(guò)程中,像var a = 2 這樣的聲明會(huì)被分解成兩個(gè)獨(dú)立的步驟:

首先,var a在其作用域中聲明新變量。這會(huì)在最開(kāi)始的階段,也就是代碼執(zhí)行前進(jìn)行。

接下來(lái),a = 2會(huì)查詢(xún)(LHS查詢(xún))變量 a 并對(duì)其進(jìn)行賦值。

LHS 和 RHS 查詢(xún)都會(huì)在當(dāng)前執(zhí)行作用域中開(kāi)始,如果有需要(也就是說(shuō)它們沒(méi)有找到所需的標(biāo)識(shí)符),就會(huì)向上級(jí)作用域繼續(xù)查找目標(biāo)標(biāo)識(shí)符,這樣每次上升一級(jí)作用域,最后到達(dá)全局作用域,無(wú)論找到或沒(méi)找到都將停止。

不成功的 RHS 引用會(huì)導(dǎo)致拋出 ReferenceError 異常。不成功的 LHS 引用會(huì)導(dǎo)致自動(dòng)隱式地創(chuàng)建一個(gè)全局變量(非嚴(yán)格模式下),該變量使用 LHS 引用的目標(biāo)作為標(biāo)識(shí)符,或者拋出 ReferenceError 異常(嚴(yán)格模式下)。

參考

我的blog 原文:JS-LHS-RHS

You Dont Know JS

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87266.html

相關(guān)文章

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

    摘要:關(guān)于兩個(gè)專(zhuān)業(yè)術(shù)語(yǔ)的討論起自對(duì)你不知道的一書(shū)的閱讀學(xué)習(xí)。遇到,編譯器會(huì)詢(xún)問(wèn)作用域是否已經(jīng)有一個(gè)該名稱(chēng)的變量存在于同一個(gè)作用域的集合中。摘錄來(lái)自你不知道的。 JS 編譯之 LHS RHS 一、前言 最近和朋友聊技術(shù)的時(shí)候,聊到 LHS RHS,我竟然沒(méi)聽(tīng)說(shuō)過(guò) 沒(méi)聽(tīng)說(shuō)過(guò)。。。 于是成功引起了我的好奇心。 關(guān)于兩個(gè)專(zhuān)業(yè)術(shù)語(yǔ)的討論起自對(duì)《你不知道的JavaScript》一書(shū)的閱讀學(xué)習(xí)。 二、編譯...

    Cristic 評(píng)論0 收藏0
  • JavaScript中作用域相關(guān)的那些點(diǎn)

    摘要:本文為你不知道的上卷中關(guān)于作用域相關(guān)的知識(shí)點(diǎn)的總結(jié)。第一層代表當(dāng)前作用域,大樓的頂層代表全局作用域。如果一定要找一個(gè)點(diǎn)與動(dòng)態(tài)詞法作用域扯上關(guān)系的話(huà),那就是值了。 本文為《你不知道的JavaScript(上卷)》中關(guān)于作用域相關(guān)的知識(shí)點(diǎn)的總結(jié)。 作用域 賦值操作 變量的賦值操作實(shí)際上有兩個(gè)動(dòng)作,首先編譯器會(huì)在當(dāng)前作用域中聲明一個(gè)變量(如果之前沒(méi)有聲明過(guò)),然后在運(yùn)行時(shí)引擎會(huì)在作用域中查找...

    coolpail 評(píng)論0 收藏0
  • javascript作用域閉包之我見(jiàn)

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

    SoapEye 評(píng)論0 收藏0
  • JavaScript 作用域不完全指北

    摘要:一旦到達(dá)頂層全局作用域,可能找到,也可能沒(méi)有找到,查找過(guò)程都必須停止。當(dāng)引擎執(zhí)行查詢(xún)時(shí),如果查詢(xún)?cè)谒星短椎淖饔糜蛑斜閷げ坏剿璧淖兞?,引擎就?huì)拋出異常。代表作用域判別失敗相關(guān),而則代表作用域判別成功了,但是對(duì)結(jié)果的操作是非法或不合理的。 什么是作用域 對(duì)于幾乎所有編程語(yǔ)言,最基本的功能之一就是能夠存儲(chǔ)變量的值,并且能在之后對(duì)這個(gè)值進(jìn)行訪(fǎng)問(wèn)和修改。這樣就會(huì)帶來(lái)幾個(gè)問(wèn)題,這些變量存儲(chǔ)在哪...

    coordinate35 評(píng)論0 收藏0
  • 理解 JavaScript 作用域

    摘要:作用域鏈前面說(shuō),作用域是根據(jù)名稱(chēng)查找變量的一套規(guī)則。把這樣一層一層嵌套的作用域,叫做作用域鏈。因?yàn)檫@個(gè)函數(shù)名無(wú)法被外部作用域所訪(fǎng)問(wèn)。的進(jìn)階用法是給其傳入?yún)?shù)這樣的好處是可以縮短查詢(xún)時(shí)的作用域鏈。 上一篇文章中分析了 JS 中的數(shù)據(jù)類(lèi)型和變量。這一篇文章將分析作用域,以及回答上一篇文章中變量提升的原因。 什么是作用域 作用域是一套規(guī)則,保存著變量,等待被引擎所查找。 var a = 1;...

    dadong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<