從編譯的角度來學作用域雀久!

作用域是什么宿稀?

思維導圖

image.png

編譯原理

我們都認為js是一門動態(tài)語言祝沸,但是其實是一門編譯語言越庇,但是不是提前編譯的卤唉,編譯結(jié)果也不能在分布式系 統(tǒng)中進行移植

編譯流程

傳統(tǒng)編譯語言的流程

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

分別是:分詞/詞法分析萍聊,解析/語法分析寿桨,代碼生成亭螟。

1. 分詞和詞法分析:

詞法單元:

將由字符組成的字符串分解成(對編程語言來說)有意義的代碼塊预烙,這些代碼塊被稱為詞法單元扁掸。

分詞和詞法分析的主要差異:

主要差異在于詞法單元的識別是通過有狀態(tài)還是無狀態(tài)的方式進行的主要差異在于詞法單元的識別是通過有狀態(tài)還是無狀態(tài)的方式進行的谴分。

2.解析/語法分析

將詞法單元流轉(zhuǎn)換為抽象的語法樹牺蹄。這個樹叫做抽象語法樹(AST)沙兰。

3.代碼生成

將 AST 轉(zhuǎn)換為可執(zhí)行代碼的過程稱被稱為代碼生成

js編譯發(fā)生的時間節(jié)點

JavaScript 的編譯過程不是發(fā)生在構(gòu)建之前的。大部分情況下編譯發(fā)生在代碼執(zhí)行前的幾微秒的時間內(nèi)鼎天。在編譯時舀奶,js引擎會盡力進行性能優(yōu)化。

理解作用域

角色

引擎

從頭到尾負責整個 JavaScript 程序的編譯及執(zhí)行過程训措。

編譯器

負責語法分析及代碼生成

作用域

負責收集并維護由所有聲明的標識符(變量)組成的一系列查詢伪节,并實施一套非常嚴格的規(guī)則光羞,確定當前執(zhí)行的代碼對這些標識符的訪問權(quán)限绩鸣。

var a = 2

其實var a = 2是執(zhí)行了2個聲明。分別在編譯器和引擎中纱兑。

首先編譯器會執(zhí)行正常的編譯呀闻,也就是詞法分析,語法分析潜慎。在最后的代碼生產(chǎn)中就會和作用域“交流”捡多。對變量進行聲明。

a = 2 這個賦值操作就是在引擎運行時進行的铐炫,變量是通過作用域進行查找垒手,如果最后沒找到就會報錯。

總結(jié):變量的賦值操作會執(zhí)行兩個動作倒信,首先編譯器會在當前作用域中聲明一個變量(如 果之前沒有聲明過)科贬,然后在運行時引擎會在作用域中查找該變量,如果能夠找到就會對 它賦值鳖悠。

LHS和RHS查詢

引擎對變量的查找分為LHS和RHS2種榜掌。

LHS 查詢則是試圖 找到變量的容器本身,從而可以對其賦值乘综。

RHS則是取到變量的源值憎账。

LHS 和 RHS 的含義是“賦值操作的左側(cè)或右側(cè)”不是“=”

特別注意:函數(shù)聲明

編譯器可以在代碼生成的同時處理聲明和值的定義,比如在引擎執(zhí)行代碼時卡辰,并不會有線程專門用來將一個函數(shù)值“分配給” 一個變量胞皱。在編譯器聲明階段函數(shù)就已經(jīng)賦值了。

引擎和作用域的對話

1.小案例

image.png

2.小案例

image.png

作用域嵌套

作用域是像一個氣泡一樣九妈,一個大氣泡包裹一個小氣泡反砌,小氣泡里面找不到的變量就會去大氣泡里面找,逐級向上的查找允蚣。

當一個塊或函數(shù)嵌套在另一個塊或函數(shù)中時于颖,就發(fā)生了作用域的嵌套。因此嚷兔,在當前作用 域中無法找到某個變量時森渐,引擎就會在外層嵌套的作用域中繼續(xù)查找做入,直到找到該變量, 或抵達最外層的作用域(也就是全局作用域)為止同衣。

遍歷嵌套作用域鏈的規(guī)則

引擎從當前的執(zhí)行作用域開始查找變量竟块,如果找不到, 就向上一級繼續(xù)查找耐齐。當?shù)诌_最外層的全局作用域時浪秘,無論找到還是沒找到,查找過程都 會停止埠况。

異常

RHS 查詢耸携,找不到就報錯

RHS 查詢在所有嵌套的作用域中遍尋不到所需的變量,引擎就會拋出 ReferenceError 異常辕翰。

LHS查詢找不到就聲明一個

當引擎執(zhí)行 LHS 查詢時夺衍,如果在頂層(全局作用域)中也無法找到目標變量, 全局作用域中就會創(chuàng)建一個具有該名稱的變量喜命,并將其返還給引擎(非嚴格模式)沟沙,嚴格模式依然報錯。

對變量亂操作

引擎會拋出另外一種類型的異常壁榕,叫作 TypeError矛紫。

undefined.xxx,var a = 3; a()這就是典型的濫用。

總結(jié)

ReferenceError 同作用域判別失敗相關(guān)牌里,而 TypeError 則代表作用域判別成功了颊咬,但是對 結(jié)果的操作是非法或不合理的。

參考

你不知道的js(上)二庵,其實就是讀書筆記贪染,哈哈哈。

本文由mdnice多平臺發(fā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末催享,一起剝皮案震驚了整個濱河市杭隙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌因妙,老刑警劉巖痰憎,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攀涵,居然都是意外死亡铣耘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門以故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜗细,“玉大人,你說我怎么就攤上這事÷剑” “怎么了踪区?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吊骤。 經(jīng)常有香客問我缎岗,道長,這世上最難降的妖魔是什么白粉? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任传泊,我火速辦了婚禮,結(jié)果婚禮上鸭巴,老公的妹妹穿的比我還像新娘眷细。我一直安慰自己,他們只是感情好奕扣,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布薪鹦。 她就那樣靜靜地躺著掌敬,像睡著了一般惯豆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奔害,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天楷兽,我揣著相機與錄音,去河邊找鬼华临。 笑死芯杀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的雅潭。 我是一名探鬼主播揭厚,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扶供!你這毒婦竟也來了筛圆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤椿浓,失蹤者是張志新(化名)和其女友劉穎太援,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扳碍,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡提岔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笋敞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碱蒙。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖夯巷,靈堂內(nèi)的尸體忽然破棺而出赛惩,到底是詐尸還是另有隱情巧还,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布坊秸,位于F島的核電站麸祷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褒搔。R本人自食惡果不足惜阶牍,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望星瘾。 院中可真熱鬧走孽,春花似錦、人聲如沸琳状。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽念逞。三九已至困食,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翎承,已是汗流浹背硕盹。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叨咖,地道東北人瘩例。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像甸各,于是被迫代替她去往敵國和親垛贤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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