var a=1和var a =b的區(qū)別

一偎蘸、引擎,編譯器杰妓,作用域

  • 引擎: ??負(fù)責(zé)整個Javascript程序的編譯及執(zhí)行過程
  • 編譯器:負(fù)責(zé)語法分析及代碼生成碘勉。
  • 作用域:負(fù)責(zé)收集并維護(hù)有所有聲明的標(biāo)識符組成的一系列查詢巷挥。

二、編譯器(編譯過程var a=1;)

  • 第一步:編譯器首先會將這段代碼分解成詞法單元验靡,然后將詞法單元解析成樹結(jié)構(gòu)倍宾。
  • 第二步:對詞法單元進(jìn)行解析,解析到var a時胜嗓,編譯器會詢問作用域是否存在一個變量名為a在同一作用域的集合中高职。如果有,編譯器就忽略此聲明辞州。反之怔锌,在要求的作用域下聲明變量。
  • 第三步:生成可以運行代碼(=1)給引擎執(zhí)行变过,生成代碼的這個過程就涉及到LHS和RHS(具體細(xì)節(jié)看第三節(jié))的倆種賦值概念埃元。
  • 第四步:引擎運行編譯器生成的代碼時,會詢問作用域是否存在在當(dāng)前作用域下變量名為a的集合媚狰,如果沒有岛杀,則在向上一級作用域查找變量名a(具體細(xì)節(jié)看第四節(jié))。如果有哈雏,引擎則對變量名為a的集合賦值楞件。

三、LHS和RHS

?????? 3.1 什么是LHS裳瘪、RHS

????????????LHS:賦值操作的目標(biāo)是誰土浸。
????????????RHS:誰是賦值操作的源頭

上面的解釋是我通過其他途徑了解到的彭羹,我自己也不是很明白黄伊。按我自己的理解:LHS就是正常的變量賦值(a=1),RHS就是通過第三方來賦值的(a=b派殷,b=2)还最。

舉例:

function foo(a){
    console.log(a);
}
var b=2
foo(b);

程序調(diào)用foo() 方法:

  • 步驟一:因為函數(shù)需要傳參,故先對foo()進(jìn)行RHS賦值
  • 步驟二:對形參a進(jìn)行LHS賦值(a=2)
  • 步驟三:對console進(jìn)行RHS賦值
  • 步驟四:對參數(shù)a進(jìn)行LHS賦值(a=2)
  • 注意:每次程序執(zhí)行(引擎)訪問變量或函數(shù)時毡惜,都會去詢問作用域該變量或函數(shù)是否存在拓轻。如果不存在則可能會向上查找,或者拋異常(第五小節(jié))经伙。
?????? 3.2 區(qū)分LHS扶叉、RHS的重要性

????????????(1)如果是LHS賦值,在頂級作用域(全局)找不到改變量,則全局作用域下枣氧,會隱式創(chuàng)建一個具有該名稱的變量溢十,并將其返還給引擎(非嚴(yán)格模式下)

   function foo(){
      a=2;
  }
  //a為定義,此時全局創(chuàng)建一個名為a的變量集合

????????????(2)如果是RHS賦值达吞,在所有嵌套的作用域下遍尋不到該所需的變量张弛,則拋出異常ReferenceError

function foo(){
  var a=b;
}
//a為定義,此時會拋ReferenceError

但在ES5中對于這個弊端酪劫,也給出了規(guī)定吞鸭。(具體看第五小節(jié))

四、引擎尋找變量

  • 當(dāng)引擎在當(dāng)前作用域找不到變量名為a的集合時契耿,會向外層嵌套的作用域進(jìn)行查找瞒大,直到找到該變量為止,或抵達(dá)最外層的作用域(也就是全局作用域)為止搪桂。
  • 在ES6中透敌,對這個弊端,也得到了解決踢械。具體可以點擊這里

五酗电、異常

  • 在ES5中引入了“嚴(yán)格模式”,嚴(yán)格禁止自動或隱式地創(chuàng)建全局變量内列。
  • 在嚴(yán)格模式中LHS查詢失敗時撵术,并不會創(chuàng)建并返回一個全局變量,引擎會拋出同查詢失敗時類似的ReferenceError異常话瞧。
  • 對于RHS賦值嫩与,如果查詢找到一個變量,但是如果你嘗試對這個變量進(jìn)行不合理操作交排,比如對一個非函數(shù)類型的值進(jìn)行函數(shù)調(diào)用划滋,或者引用null,underfined類型的值中的操作,那么引擎會拋出另外一個異常埃篓,叫做TypeError处坪。
  • 總結(jié):在嚴(yán)格模式下,拋出異常ReferenceError則同作用域判別失敗相關(guān)架专,而TypeError則代表作用域判別成功了同窘,但是對結(jié)果的操作是不合法的

進(jìn)階版

歡迎訪問我的個人博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末部脚,一起剝皮案震驚了整個濱河市想邦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌委刘,老刑警劉巖丧没,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件服傍,死亡現(xiàn)場離奇詭異,居然都是意外死亡骂铁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門罩抗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拉庵,“玉大人,你說我怎么就攤上這事套蒂〕В” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵操刀,是天一觀的道長烁挟。 經(jīng)常有香客問我,道長骨坑,這世上最難降的妖魔是什么撼嗓? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮欢唾,結(jié)果婚禮上且警,老公的妹妹穿的比我還像新娘。我一直安慰自己礁遣,他們只是感情好斑芜,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祟霍,像睡著了一般杏头。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沸呐,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天醇王,我揣著相機(jī)與錄音,去河邊找鬼垂谢。 笑死厦画,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滥朱。 我是一名探鬼主播根暑,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼徙邻!你這毒婦竟也來了排嫌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缰犁,失蹤者是張志新(化名)和其女友劉穎淳地,沒想到半個月后穗椅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡棍矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年你虹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣钳。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扰魂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕴茴,到底是詐尸還是另有隱情劝评,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布倦淀,位于F島的核電站蒋畜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撞叽。R本人自食惡果不足惜姻成,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愿棋。 院中可真熱鬧佣渴,春花似錦、人聲如沸初斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽见秤。三九已至砂竖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹃答,已是汗流浹背乎澄。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留测摔,地道東北人置济。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像锋八,于是被迫代替她去往敵國和親浙于。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

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