JS系列(二):LHS & RHS

顧名思義档插,字面意思:

  • LHS:Left Handle Side;
  • RHS:Right Handle Side;

考慮如下代碼:

var a = 1; // LHS:將值1,賦值給變量a
var b = a; // RHS:查詢變量a是否聲明非区,然后獲取a的值,再LHS:賦值給變量b

一目了然盹廷,LHS和RHS的作用征绸,因此,LHS和RHS不應(yīng)該只從字面上理解它俄占,而是應(yīng)該換種方式來理解:

  • LHS:賦值操作的目標(biāo)管怠;
  • RHS:賦值操作的源頭;

測驗(yàn)題:

 // 考查有多少次LHS和RHS操作
 function foo(a) {
     var b = a;
     return a + b;
 }
 var c = foo(2);

 //////////////////////分析如下//////////////////////
 1. 首次執(zhí)行foo(..)函數(shù)缸榄,所以需要RHS查詢是否已有foo函數(shù)聲明渤弛;
2. 將數(shù)值2傳遞給foo函數(shù),這里有個(gè)LHS隱式操作:a = 2;
3. var b = a; 先RHS查詢變量a甚带,獲取a的值她肯,然后LHS賦值給變量b;
4. return a + b鹰贵;就是兩次RHS晴氨,分別是變量a和變量b;
5. var c = ...;將foo函數(shù)的結(jié)果LHS賦值給變量c碉输;

故LHS和RHS的操作次數(shù):
LHS => 3次
    1. 隱式賦值(形參a = ...)瑞筐;
    2. var b = ...;
    3. var c = ...腊瑟;
RHS => 4次
    1. foo(...)聚假;
    2. ... = a;
    3. a + ...闰非;
    4. ... + b膘格;

對(duì)于LHS和RHS,還有一點(diǎn)需要說明(非嚴(yán)格模式):
當(dāng)LHS和RHS在查詢變量時(shí)(從當(dāng)前作用域财松,一級(jí)級(jí)往上查找瘪贱,直到全局作用域?yàn)橹梗┥纯兀匀徽也坏剑藭r(shí)菜秦,LHS與RHS的表現(xiàn)行為不一致甜害。

 // 如下代碼
 function foo(a) {
     console.log(a);
     b = a; // code 1
     a = c; // code 2
 }
 foo(2);

 var test = 1;
test(); // code 3

code 1 =>

變量b并沒有在任何地方聲明,且是LHS操作(將變量a賦值給變量b)球昨,LHS會(huì)如下操作:

  • 查詢當(dāng)前作用域尔店,也就是foo函數(shù);
  • 然后查詢?nèi)肿饔糜颍?/li>
  • 停止主慰;

最終仍舊查詢不到變量b的聲明嚣州,此時(shí),LHS會(huì)在全局對(duì)象(window)中創(chuàng)建一個(gè)變量b共螺,然后將變量a的值賦值給變量b(此時(shí)该肴,變量b是全局變量);

code 2 =>

同樣藐不,變量c未在任何地方聲明也初使化匀哄,且是RHS操作(查詢變量c的值并賦值給變量a),RHS會(huì)如下操作:

  • 查詢當(dāng)前作用域雏蛮,也就是foo函數(shù)涎嚼;
  • 然后查詢?nèi)肿饔糜颍?/li>
  • 停止;

最終仍舊查詢不到變量c的聲明底扳,此時(shí)铸抑,RHS會(huì)拋出一個(gè)異常:ReferenceError!

code 3 =>

RHS操作衷模,查詢到test有聲明鹊汛,且在全局作用域下,但是阱冶,test是一個(gè)變量刁憋,而不是函數(shù),因此木蹬,RHS會(huì)拋出一個(gè)異常:TypeError至耻!

以下對(duì)兩種異常的解釋:

1. TypeError:
試圖對(duì)一個(gè)非函數(shù)類型的值進(jìn)行函數(shù)調(diào)用,或著引用 null 或 undefined 類型的值中的
屬性镊叁,那么引擎會(huì)拋出一種類型的異常尘颓,叫作 TypeError。

2. ReferenceError:
ReferenceError 同作用域判別失敗相關(guān)晦譬,而 TypeError 則代表作用域判別成功了疤苹,
但是對(duì)結(jié)果的操作是非法或不合理的。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敛腌,一起剝皮案震驚了整個(gè)濱河市卧土,隨后出現(xiàn)的幾起案子惫皱,更是在濱河造成了極大的恐慌,老刑警劉巖尤莺,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旅敷,死亡現(xiàn)場離奇詭異,居然都是意外死亡颤霎,警方通過查閱死者的電腦和手機(jī)媳谁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捷绑,“玉大人韩脑,你說我怎么就攤上這事氢妈〈馕郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵首量,是天一觀的道長壮吩。 經(jīng)常有香客問我,道長加缘,這世上最難降的妖魔是什么鸭叙? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拣宏,結(jié)果婚禮上沈贝,老公的妹妹穿的比我還像新娘。我一直安慰自己勋乾,他們只是感情好宋下,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辑莫,像睡著了一般学歧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上各吨,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天枝笨,我揣著相機(jī)與錄音,去河邊找鬼揭蜒。 笑死横浑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屉更。 我是一名探鬼主播徙融,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偶垮!你這毒婦竟也來了张咳?” 一聲冷哼從身側(cè)響起帝洪,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脚猾,沒想到半個(gè)月后葱峡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡龙助,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年砰奕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提鸟。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡军援,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出称勋,到底是詐尸還是另有隱情胸哥,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布赡鲜,位于F島的核電站空厌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏银酬。R本人自食惡果不足惜嘲更,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揩瞪。 院中可真熱鬧赋朦,春花似錦、人聲如沸李破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喷屋。三九已至琳拨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屯曹,已是汗流浹背狱庇。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恶耽,地道東北人密任。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像偷俭,于是被迫代替她去往敵國和親浪讳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 傳統(tǒng)編譯語言的流程中涌萤,程序中的一段源代碼在執(zhí)行之前會(huì)經(jīng)歷三個(gè)步驟淹遵,統(tǒng)稱為“編譯”口猜。分詞/詞法分析(Tokenizi...
    青春前行閱讀 617評(píng)論 0 0
  • 參考資料:凱爾·辛普森《你不知道的JavaScript(上卷)》 1. 編譯原理 JavaScript引擎首先會(huì)在...
    DebraJohn閱讀 1,834評(píng)論 0 1
  • 作用域中LHS查詢和RHS查詢 LHS查詢:賦值操作左側(cè)的查詢,LHS查詢試圖找到變量的容器本身透揣,济炎,從而對(duì)其賦值。...
    Splendid飛羽閱讀 724評(píng)論 0 1
  • 在學(xué)習(xí) javascript 的過程中辐真,我們第一步最應(yīng)該了解和掌握的就是作用域须尚,與之相關(guān)還有程序是怎么編譯的,變量...
    liuxuan閱讀 1,180評(píng)論 1 8
  • 一般我們將 JavaScript 歸類為 “動(dòng)態(tài)” 或 “解釋執(zhí)行”語言侍咱,但事實(shí)上JavaScript也是一門編譯...
    了凡和纖風(fēng)閱讀 378評(píng)論 0 1