成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

深度剖析JavaScript作用域從局部到全局一網(wǎng)打盡

瀏覽:219日期:2022-06-09 16:23:40
目錄
  • JavaScript作用域深度剖析:從局部到全局一網(wǎng)打盡
    • 1.1 編譯原理
    • 1.2 理解作用域
      • 1.2.1 演員表
      • 1.2.2 對話
      • 1.2.3 編譯器有話說
      • 1.2.5
    • 1.3 作用域嵌套
      • 1.4 異常
        • 1.5 小結(jié)
        • 特殊字符描述:

          JavaScript作用域深度剖析:從局部到全局一網(wǎng)打盡

          1.1 編譯原理

          • JavaScript 事實上是一門編譯語言。

          在傳統(tǒng)編譯語言中,一段源代碼執(zhí)行前會經(jīng)歷三個步驟:

          分詞/詞法分析(Tokenizing/Lexing)

          var a = 2;// 分解后:var、a、=、2、;// 空格是否會被當(dāng)做詞法單元,取決于空格在這門語言中是否具有意義。
          • 期間經(jīng)過兩個過程:分詞(tokenizing)和詞法分析(Lexing) 、兩者的主要差別在于詞法單元的識別是通過有狀態(tài)還是無狀態(tài)的方式進(jìn)行的。

          解析/語法分析(Parsing)

          • 這個過程就是將詞法單元流(數(shù)組)轉(zhuǎn)換為一個由元素逐級嵌套組成的代表了程序語法結(jié)構(gòu)的樹,這個樹被稱為"抽象語法樹"。(Abstract Syntax Tree, AST)。

          代碼生成

          • 將 AST 轉(zhuǎn)換為可執(zhí)行代碼的過程被稱為代碼生成。也就是說有某種方法將 var a = 2; 的 AST 轉(zhuǎn)換為一組機器指令,用來創(chuàng)建一個叫做 a 的變量(包含分配內(nèi)存等),將一個值儲存于 a 中。
          • 比起其他編譯過程只有這三個步驟的語言的編譯器,JavaScript 引擎要復(fù)雜得多,在語法分析和代碼生成階段有著特定的步驟來對比運行性能進(jìn)行優(yōu)化,包括對冗余元素進(jìn)行優(yōu)化等。
          • 簡單來說,任何 JavaScript 代碼片段在執(zhí)行前都要進(jìn)行編譯(通常就在執(zhí)行前)

          1.2 理解作用域

          1.2.1 演員表

          • 引擎:從頭到尾負(fù)責(zé)整個 JavaScript 程序的編譯及執(zhí)行過程。
          • 編譯器:引擎的好朋友之一,負(fù)責(zé)語法分析及代碼生成等臟活累活。
          • 作用域:引擎的另一個好朋友,負(fù)責(zé)收集并維護(hù)由所有聲明的標(biāo)識符(變量)組成的一系列查詢,并實行一套嚴(yán)格的規(guī)則,確定當(dāng)前執(zhí)行的代碼對這些標(biāo)識符的訪問權(quán)限。

          1.2.2 對話

          • var a = 2; 這段代碼是一句聲明。但會經(jīng)過編譯器和引擎的處理來進(jìn)行。
          • S: 變量的賦值操作會執(zhí)行兩個動作,首先編譯器會在當(dāng)前作用域中聲明一個變量(如果之前沒有聲明過),然后在運行時引擎會在作用域中查找該便令,如果能夠找到就會對它進(jìn)行賦值。

          1.2.3 編譯器有話說

          編譯器在編譯過程中的第二步中生成了代碼,引擎執(zhí)行它時,會通過查找變量 a 來判斷他是否已聲明過。查找的過程由作用域進(jìn)行協(xié)助,但是引擎執(zhí)行怎樣的查找會影響最終的查找結(jié)果。

          引擎常使用的查詢類型為:LHS和RHS

          LHS: 賦值操作的目標(biāo)是誰

          RHS: 誰是賦值操作的源頭

          1.2.5

          function foo(a) {    var b = a;    return a + b;}var c = foo(2);// 對話:1. 聲明 var c2. 對 c 進(jìn)行 LHS3. 對 foo(2) 進(jìn)行 RHS4. function foo(a) 期間會進(jìn)行 a = 2, 對 a 進(jìn)行 LHS5. 聲明 var b6. 對 b 進(jìn)行 LHS7. 對 a 進(jìn)行 RHS8. return a + b; 分別對 a、b 進(jìn)行 RHS// 答案:1. 所有的 LHS(一共有3處)    1. c =..;    2. a = 2(隱士變量分配)    3. b = ..2. 所有的 RHS (一共有4處)    1. foo(2..    2. = a;    3. a..    4. .. b

          1.3 作用域嵌套

          作用域是根據(jù)名稱查找變量的一套規(guī)則。

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

          // 非嚴(yán)格模式下function foo(a) {console.log(a + b);}var a = 2;foo(2); // 4// 嚴(yán)格模式下:function foo(a) {console.log(a + b);}var a = 2;foo(2); // 4

          遍歷嵌套作用域鏈的規(guī)則:引擎會從當(dāng)前的執(zhí)行作用域中開始查找變量,如果找不到就會向上一級中繼續(xù)查找。當(dāng)?shù)诌_(dá)最外層的全局作用域時,無論找到還是沒找到,查找的過程都會停止。

          例子:

          • 整個建筑代表程序中的嵌套作用域鏈,第一層樓代表當(dāng)前的執(zhí)行作用域,也就是你所處的位置。建筑的頂層代表全局作用域。
          • 引擎查找的方式:LHS 和 RHS 引用會先在當(dāng)前樓層中進(jìn)行查找,如果沒找到,就會坐電梯前往上一層樓樓,如果還是沒找到就會繼續(xù)上下,以此類推。一旦達(dá)到了頂層(全局作用域), 可能找到你了你所需的變量,也可能沒找到,但無論如何查找過程都會停止。

          1.4 異常

          為什么區(qū)分 LHS 與 RHS 是一種重要的事?

          因為在變量還未聲明(在任何作用域中都無法找到該變量)的情況下,引擎的這兩種查詢行為是不一樣的。

          // 非嚴(yán)格模式下:function foo(a) {console.log(a + b);b = a;}foo(2); // 4// 嚴(yán)格模式下:"use strict";function foo(a) {console.log(a + b);b = a;}foo(2); // ReferenceError: b is not defined

          上述代碼引擎行為:

          • 非嚴(yán)格模式下:

          第一次對 b(.. + b) 進(jìn)行 RHS 查詢時未找到該變量,也就是說,這是一個"未聲明" 的變量,因為在任何相關(guān)的作用域都無法找到它。

          第二次對 b(b = ..) 進(jìn)行 LHS 查詢時,如果在頂層(全局作用域)中也沒找到該變量,就會在全局作用域中隱式地創(chuàng)建一個該名稱的變量,并將其返回給引擎。

          ......

          • 嚴(yán)格模式下:

          第一次對 b(.. + b) 進(jìn)行 RHS 查詢時未找到該變量,也就是說,這是一個"未聲明" 的變量,因為在任何相關(guān)的作用域都無法找到它,直接拋出 'ReferenceError'。

          ......

          • 非嚴(yán)格模式下引擎查找規(guī)則

            當(dāng)引擎執(zhí)行 RHS 查詢在所有嵌套的作用域中找不到所需的變量,引擎就會拋出 ReferenceError 異常。

            當(dāng)引擎執(zhí)行 LHS 查詢時,如果在頂層作用域中也無法找到該變量,全局作用域就會創(chuàng)建一個該名稱的變量,并將其返回給引擎(非嚴(yán)格模式下)。

          • 嚴(yán)格模式下引擎查找規(guī)則

            ES5 引入了 "嚴(yán)格模式"(use strict),在行為上有很多不同,其中一個不同的行為就是嚴(yán)格模式下禁止自動或隱式地創(chuàng)建全局變量。因此在嚴(yán)格模式中引擎執(zhí)行 LHS 查詢失敗時,并不會創(chuàng)建一個全局變量,而是直接拋出一個 ReferenceError

            如果 RHS 找到了一個變量,但嘗試對這個變量進(jìn)行一些不合理的操作時,比如對一個非函數(shù)類型的值進(jìn)行函數(shù)調(diào)用,或者引用 nullundefined 類型的之中屬性,那引擎則會拋出另外一種類型的異常 TypeError。

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

          1.5 小結(jié)

          作用域是根據(jù)名稱查找變量的一套規(guī)則。

          引擎常使用的查詢類型為:LHS 和 RHS

          • LHS: 賦值操作的目標(biāo)是誰
          • = 操作符在調(diào)用函數(shù)時的形參會導(dǎo)致關(guān)聯(lián)作用的賦值操作。也就是說 foo (a, b, c...), 都會有 a = xxx, b = xxx, c = xxx ...... 的行為。
          • RHS: 誰是賦值操作的源頭

          非嚴(yán)格模式下引擎查找規(guī)則

          當(dāng)引擎執(zhí)行 RHS 查詢在所有嵌套的作用域中找不到所需的變量,引擎就會拋出 ReferenceError 異常。

          當(dāng)引擎執(zhí)行 LHS 查詢時,如果在頂層作用域中也無法找到該變量,全局作用域就會創(chuàng)建一個該名稱的變量,并將其返回給引擎(非嚴(yán)格模式下)。

          嚴(yán)格模式下引擎查找規(guī)則

          ES5 引入了 "嚴(yán)格模式"(use strict),在行為上有很多不同,其中一個不同的行為就是嚴(yán)格模式下禁止自動或隱式地創(chuàng)建全局變量。因此在嚴(yán)格模式中引擎執(zhí)行 LHS 查詢失敗時,并不會創(chuàng)建一個全局變量,而是直接拋出一個 ReferenceError

          如果 RHS 找到了一個變量,但嘗試對這個變量進(jìn)行一些不合理的操作時,比如對一個非函數(shù)類型的值進(jìn)行函數(shù)調(diào)用,或者引用 nullundefined 類型的之中屬性,那引擎則會拋出另外一種類型的異常 TypeError。

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

          特殊字符描述:

          • 問題標(biāo)注 Q:(question)
          • 答案標(biāo)注 R:(result)
          • 注意事項標(biāo)準(zhǔn):A:(attention matters)
          • 詳情描述標(biāo)注:D:(detail info)
          • 總結(jié)標(biāo)注:S:(summary)
          • 分析標(biāo)注:Ana:(analysis)
          • 提示標(biāo)注:T:(tips)

          以上就是深度剖析JavaScript作用域從局部到全局一網(wǎng)打盡的詳細(xì)內(nèi)容,更多關(guān)于JavaScript作用域局部全局的資料請關(guān)注其它相關(guān)文章!

          標(biāo)簽: JavaScript
          相關(guān)文章:
          成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
          成人亚洲精品久久久久软件| 在线亚洲精品| 国产私拍一区| 国产精品欧美久久久久一区二区| 国产高清不卡一区二区| 精品视频1区2区3区| 日韩国产欧美三级| 亚洲制服av| 亚洲精品成人天堂一二三| 黄色日韩在线| 久久精品欧美一区二区三区不卡| 成人av手机在线观看| 欧美成人女星排行榜| 粉嫩av一区二区三区| 日韩欧美国产一二三区| 国产精品自拍三区| 91麻豆精品国产91久久久久久| 韩日av一区二区| 欧美一区二区视频在线观看2020| 久久99精品久久久久久动态图| 色菇凉天天综合网| 午夜电影一区二区| 可以免费看不卡的av网站| 亚洲国产成人高清精品| 男女精品网站| 日日夜夜精品视频免费| 色天使色偷偷av一区二区| 天天色天天爱天天射综合| 久久久久免费| 蜜桃精品在线观看| 欧美视频一区二区三区四区 | 欧美精品激情| 国产农村妇女精品| 一区二区亚洲| 夜夜亚洲天天久久| 色哟哟国产精品| 精品一区二区在线视频| 在线不卡一区二区| 成人国产免费视频| 国产免费观看久久| 亚洲国产精品久久久久婷婷老年| 一区二区三区中文字幕在线观看| 国产亚洲在线观看| 日韩二区在线观看| 3d动漫精品啪啪| 波多野结衣中文字幕一区| 国产亚洲福利社区一区| 狠狠色伊人亚洲综合网站色| 亚洲三级久久久| 国产精品久久久一区二区三区| 亚洲丶国产丶欧美一区二区三区| 色视频欧美一区二区三区| 久久66热re国产| 精品国产一区二区三区不卡| 欧美在线高清| 亚洲老司机在线| 色一情一伦一子一伦一区| 国产成人一区二区精品非洲| 亚洲精品一区二区三区精华液 | 老牛国产精品一区的观看方式| 国产综合久久久久久久久久久久| 精品日韩一区二区三区免费视频| 欧美福利专区| 亚洲最大成人网4388xx| 在线这里只有精品| 成人aa视频在线观看| 中文字幕av一区二区三区免费看| 亚洲精品在线观看免费| 五月婷婷欧美视频| 91精品国产黑色紧身裤美女| 91在线一区二区三区| 亚洲情趣在线观看| 欧美色图片你懂的| 欧美jizzhd精品欧美巨大免费| 曰韩精品一区二区| 欧美日韩久久久| 91视频精品在这里| 亚洲国产日日夜夜| 日韩一区二区精品在线观看| 欧美日韩日本网| 亚洲丶国产丶欧美一区二区三区| 欧美私模裸体表演在线观看| 91网站在线播放| 亚洲一区二区三区四区的| 欧美日韩精品是欧美日韩精品| 91在线视频官网| 亚洲一区中文在线| 宅男噜噜噜66一区二区66| 精品国产91乱码一区二区三区| 国产一区二区三区久久| 国产一区二区福利| 亚洲日本电影在线| 欧美福利视频一区| 国产成人激情av| 成人精品鲁一区一区二区| 国产亚洲成aⅴ人片在线观看| 亚洲国产一区二区三区在线播| 美女脱光内衣内裤视频久久影院| 久久这里只有精品6| 亚洲作爱视频| 国产专区综合网| 国产精品一级二级三级| 亚洲日本成人在线观看| 欧美美女黄视频| 在线精品一区二区| 韩国成人精品a∨在线观看| 成人欧美一区二区三区小说| 国产高清精品网站| 中文字幕巨乱亚洲| 欧美视频在线一区二区三区 | 日韩电影在线观看一区| 欧美精品一区二区在线播放| 美女精品在线| 欧美jizzhd精品欧美喷水| 美美哒免费高清在线观看视频一区二区 | 九九**精品视频免费播放| 椎名由奈av一区二区三区| 正在播放一区二区| 久久久蜜桃一区二区人| 91丨porny丨蝌蚪视频| 久久不见久久见免费视频7 | 好看不卡的中文字幕| 国产原创一区二区| 亚洲乱码中文字幕| 日韩精品一区二区三区老鸭窝 | 91在线观看一区二区| 日本成人中文字幕| 亚洲欧洲精品天堂一级| 日韩欧美久久久| 91黄色免费网站| 日韩一区二区久久| 99视频一区二区| 久久99精品国产.久久久久久| 亚洲男人电影天堂| 久久久久国产免费免费| 在线中文字幕不卡| 日韩视频在线播放| 91香蕉视频mp4| 国产成人午夜精品5599| 日日摸夜夜添夜夜添国产精品 | 亚洲欧洲日产国产综合网| 日韩免费观看2025年上映的电影| 久久亚洲一区二区| 亚洲福利国产| 欧美一区二区在线| 国产成人小视频| 美女视频黄 久久| 午夜精品在线看| 亚洲人妖av一区二区| 欧美videos中文字幕| 欧美日本一道本在线视频| 久久精品成人一区二区三区蜜臀| 精品91视频| 欧美日韩亚洲三区| 成人av资源在线| 国产成人免费视频网站| 精品影院一区二区久久久| 青草av.久久免费一区| 亚洲一区在线视频观看| 日韩伦理av电影| 欧美极品少妇xxxxⅹ高跟鞋 | 日韩精品一区二区三区四区视频| 欧美性色黄大片| 久久五月激情| 美女黄网久久| 国产精品一国产精品k频道56| 亚洲欧洲视频| 亚洲午夜在线观看| 国内久久视频| 亚洲午夜精品福利| 欧美精品日本| 欧美va天堂在线| 91丨九色丨黑人外教| 93久久精品日日躁夜夜躁欧美| 成人av片在线观看| 成人av网站在线| 99久久夜色精品国产网站| 福利电影一区二区| 国产成都精品91一区二区三| 国产揄拍国内精品对白| 欧美日韩亚洲一区二区三区在线观看| 日本一区二区视频在线观看| 这里是久久伊人| 国产精品美女视频| 国产日韩欧美高清| 国产亚洲1区2区3区| 久久午夜免费电影| 久久天堂av综合合色蜜桃网| 精品国产麻豆免费人成网站| 26uuu久久综合| 久久久噜噜噜久久人人看| 2019国产精品| 日韩美一区二区三区| 日韩午夜电影在线观看| 欧美成人vps| 欧美韩国日本不卡| 国产精品每日更新在线播放网址| 国产精品进线69影院| 亚洲欧美另类综合偷拍| 亚洲精品日韩一|