記一條關(guān)于 js 左右引用(LHS RHS )的題目

之前看過 《You don't know js》中說到的 LHS ,RHS.
然而還是對這個知識點懵懵懂懂 嫡霞, 了解粗淺较木。

碰到這種題目一時間還是無法理解:

var foo = { n: 1 };
var bar = foo;
foo.x = foo = { n: 2 };
console.log(foo.x) // ?
console.log(bar.x) // ?

在這之前先簡單說一下前提概念:

簡述編譯原理

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

1. 分詞/詞法分析
2. 解析/語法分析
3. 代碼生成

先看原書對一個賦值操作的拆解說明:

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

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

LHS 和 RHS

字面意思其實是 Left Hand Side和 Right Hand Side 即左手邊和右手邊
一般可以理解為 賦值操作的左側(cè)和右側(cè)

但更準確來說,
LHS 是 查找變量的 內(nèi)存地址 (類似于C語言中的變量對應(yīng)的指針值)
RHS 是 查詢變量的 .

先舉個最簡單的例子:

var a=1;

從這里 發(fā)生了一次 LHS 引用: var a... ,獲取 a 的變量地址讼稚,然后把 1 賦值給 a.

再來一個:

console.log(a);

顯然 , 為了打印 變量 a 的值 , 這里需要獲取到 a的具體值 , 發(fā)生了 RHS

延伸到函數(shù):

function sayHi(name){
  console.log(name);
}
sayHi('小明');

第一步括儒,這里 sayHi ('小明') ,其中 sayHi... 調(diào)用了RHS,獲取這個函數(shù)的內(nèi)容.
第二步绕沈,括號里面進行了一次傳參,也就是 name = 小明 , 發(fā)生了一次LHS帮寻,把 小明 賦值給 name
第三步乍狐, console.log(..)本身也需要一個 RHS 引用,即對 console 對象進行 RHS 查詢规婆,并且檢查得到的值中是否有一個叫做 log 的方法澜躺。
第四步蝉稳, console.log(name) , 為了獲取到 name具體的值 發(fā)生RHS ,

總結(jié)就是 , 執(zhí)行 sayHi('小明') 這個過程中 ,一共發(fā)生了 一次LHS抒蚜,三次RHS。

可以來道小題練練手:
試試找出其中的3處 LHS 查詢耘戚,4處 RHS 查詢

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

LHS 查詢
c = ..;
a = 2(隱式變量分配)
b = ..

RHS 查詢
foo(2..
= a;
a ..
.. b

重新做題

接下來回到文中開頭的題目:

var foo = { n: 1 };
var bar = foo;
foo.x = foo = { n: 2 };
console.log(foo.x) // ?
console.log(bar.x) // ?

詳細解析可以參考

https://juejin.im/entry/5acb0dc55188255c5668bbe2?utm_source=gold_browser_extension

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗡髓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子收津,更是在濱河造成了極大的恐慌饿这,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撞秋,死亡現(xiàn)場離奇詭異长捧,居然都是意外死亡,警方通過查閱死者的電腦和手機吻贿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門串结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舅列,你說我怎么就攤上這事肌割。” “怎么了帐要?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵把敞,是天一觀的道長。 經(jīng)常有香客問我榨惠,道長奋早,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任赠橙,我火速辦了婚禮耽装,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘简烤。我一直安慰自己剂邮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布横侦。 她就那樣靜靜地躺著挥萌,像睡著了一般绰姻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上引瀑,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天狂芋,我揣著相機與錄音,去河邊找鬼憨栽。 笑死帜矾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屑柔。 我是一名探鬼主播屡萤,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掸宛!你這毒婦竟也來了死陆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤唧瘾,失蹤者是張志新(化名)和其女友劉穎措译,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饰序,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡领虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了求豫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌衰。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖注祖,靈堂內(nèi)的尸體忽然破棺而出猾蒂,到底是詐尸還是另有隱情,我是刑警寧澤是晨,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布肚菠,位于F島的核電站,受9級特大地震影響罩缴,放射性物質(zhì)發(fā)生泄漏蚊逢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一箫章、第九天 我趴在偏房一處隱蔽的房頂上張望烙荷。 院中可真熱鬧,春花似錦檬寂、人聲如沸终抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昼伴。三九已至匾旭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圃郊,已是汗流浹背价涝。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留持舆,地道東北人色瘩。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像逸寓,于是被迫代替她去往敵國和親居兆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容