精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript中的執行上下文和變量提升

開發 前端
與許多同類語言相比,JavaScript 是一種易于學習的編程語言。但是,如果您想理解、調試和編寫更好的代碼,則需要多加注意一些基本概念。

[[422216]]

本文轉載自微信公眾號「新鈦云服」,作者林泓輝 翻譯。轉載本文請聯系新鈦云服公眾號。

與許多同類語言相比,JavaScript 是一種易于學習的編程語言。但是,如果您想理解、調試和編寫更好的代碼,則需要多加注意一些基本概念。

在本文中,我們將了解兩個這樣的概念:

  • 執行上下文
  • 變量提升

作為一個初學者的JavaScript,了解這些概念將有助于您了解this關鍵字,作用域和閉包。

JavaScript 中的執行上下文

一般來說,一個 JavaScript 源文件會有多行代碼。作為開發人員,我們將代碼組織成變量、函數、數據結構(如對象和數組)等等。

語法環境決定了我們如何以及在何處編寫代碼。看看下面的代碼:

  1. function doSomething() { 
  2.  var age= 7; 
  3.  // Some more code 

在上面的代碼中,變量age在語法上位于函數內部doSomething。

請注意,我們的代碼不會按原樣運行。它必須由編譯器翻譯成計算機可理解的字節碼。通常,語法環境在您的代碼中會有多個。然而,并不是所有的環境都會同時執行。

幫助代碼執行的環境稱為執行上下文。它是當前正在運行的代碼,以及有助于運行它的一切。可以有很多語法環境,但當前運行的代碼只能有一個執行上下文。

查看下圖以了解語法環境和執行上下文之間的區別:

語法環境與執行上下文

那么在執行上下文中到底發生了什么?代碼被逐行解析,生成可執行的字節碼,分配內存并執行。

讓我們采用我們在上面看到的相同函數。您認為執行以下行時可能會發生什么?

  1. var age = 7; 

這段源代碼在最終執行之前經歷了以下階段:

  • 標記:在此階段,源代碼字符串分解為多個有意義的塊,稱為Tokens. 例如,代碼var age = 7;標記為var , age , = , 7和, ; .
  • 解析:下一個階段是解析,在這個階段,一個標記數組變成一個由語言語法理解的嵌套元素樹。這棵樹被稱為AST(抽象語法樹)。
  • 代碼生成:在這個階段,在解析階段創建的 AST 變成可執行的字節碼。該可執行字節碼隨后由 JIT(即時)編譯器進一步優化。

下面的動畫圖片顯示了源代碼到可執行字節碼的轉換。

可執行字節碼的源代碼

所有這些事情都發生在一個執行上下文中。所以執行上下文是代碼的特定部分的執行環境。

有兩種類型的執行上下文:

  • 全局執行上下文 (GEC)
  • 函數執行上下文 (FEC)

每個執行上下文都有兩個階段:

  • 創建階段
  • 執行階段

讓我們詳細看看它們中的每一個,并更好地理解它們。

JavaScript 中的全局執行上下文 (GEC)

每當我們執行 JavaScript碼時,它都會創建一個全局執行上下文(也稱為基本執行上下文)。全局執行上下文有兩個階段。

創建階段

在創建階段,創建了兩個獨特的東西:

  • 調用的全局對象window(用于客戶端 JavaScript)。
  • 一個名為this的變量。

如果代碼中聲明了任何變量,則會為該變量分配內存。該變量使用唯一key進行初始化,并賦值為undefined。

如果代碼中有function ,它會被直接放入內存中。我們將在Hoisting后面的部分中詳細了解這部分。

執行階段

代碼執行在這個階段開始。在這里進行全局變量的賦值。請注意,這里沒有調用函數,因為它發生在函數執行上下文中。我們將在后面討論這個問題。

讓我們通過幾個例子來理解這兩個階段。

示例 1:加載空腳本

創建一個名為index.js的空 JavaScript 文件及一個包含以下內容的 HTML 文件:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.    <meta charset="UTF-8"
  5.    <meta http-equiv="X-UA-Compatible" content="IE=edge"
  6.    <meta name="viewport" content="width=device-width, initial-scale=1.0"
  7.    <title>Document</title> 
  8.    <script src='./index.js'></script> 
  9. </head> 
  10. <body> 
  11.   I'm loading an empty script 
  12. </body> 
  13. </html> 

我們使用<script>標簽將空腳本文件導入到 HTML 文件中。

在瀏覽器中加載 HTML 文件并打開 Chrome DevTools(快捷鍵通常為F12)或其他瀏覽器也是可以的。選擇console選項卡,鍵入window并按回車鍵。您可以看到瀏覽器的Window對象。

windows對象

現在,輸入this并按回車鍵。您可以看到和Window對象一樣的this對象。

'this' 的值

如果您輸入window === this則會得到返回值true

好的,那么我們學到了什么?

  • 當我們加載 JavaScript 文件時,即使它是空的,也會創建全局執行上下文。
  • 它在創建階段為我們創建了兩個特殊的東西,即window對象和this。
  • 在全局執行上下文中,window對象 和this是相等的。
  • 因為腳本文件是空白的,所以沒有什么可以執行的。所以在執行階段什么也不會發生。

示例 2:使用變量和函數

現在讓我們看一個在 JavaScript 文件中包含一些代碼的示例。我們將添加一個變量blog,并為其分配一個值。我們還將定義一個名為logBlog的函數。

  1. var blog = 'freeCodeCamp'
  2.  
  3. function logBlog() { 
  4.  console.log(this.blog);  

在創建階段:

  • 全局對象window和變量this被創建。
  • 內存被分配給變量blog和函數logBlog。
  • 該變量blog由一個特殊值undefined初始化。該函數logBlog直接放置在內存中。

在執行階段:

  • 值freeCodeCamp被分配給變量blog。
  • 由于我們已經定義了函數但還沒有調用它,因此函數執行不會發生。我們將調用該函數,看看當我們了解函數執行上下文時會發生什么。

JavaScript 中的函數執行上下文 (FEC)

當我們調用一個函數時,會創建一個函數執行上下文。讓我們擴展上面使用的相同示例,但這次我們將調用該函數。

  1. var blog = 'freeCodeCamp'
  2.  
  3. function logBlog() { 
  4.  console.log(this.blog);  
  5.  
  6. // Let us call the function 
  7. logBlog(); 

函數執行上下文經歷相同的階段,即創建和執行。

函數執行階段可以訪問一個名為arguments的特殊值。它是傳遞給函數的參數。但在我們的示例中,沒有傳遞任何參數。

請注意,在全局執行上下文中創建的window對象和this變量仍然可以在此上下文中訪問。

當一個函數調用另一個函數時,會為新的函數調用創建一個新的函數執行上下文。每個函數中相應的變量只能在對應的執行上下文中使用。

在 JavaScript 中的變量提升

讓我們轉到另一個基本概念Hoisting。當我第一次聽說Hoisting時,花了一些時間才理解這個意思。

在英語中,hoisting 的意思是使用繩索和滑輪提升某物。這可能會誤導您認為 JavaScript 引擎會在特定代碼執行階段拉取變量和函數。接下來,讓我們理解Hoisting的意思。

JavaScript 中的變量提升

請看下面的例子并猜測輸出:

  1. console.log(name); 
  2. var name;    // undefined 

然而,為什么是undefined?如果我們在其他編程語言中使用類似的代碼。在這種情況下,我們將在控制臺得到報錯,指出該變量name未聲明,而我們正試圖在此之前訪問它。但是在JavaScript的執行上下文里:

在創建階段,

  • 內存被分配給變量name,并且
  • 一個特殊的值undefined被分配給變量。

在執行階段,

該console.log(name)語句將執行。

這種為變量分配內存并賦值為undefined在執行上下文的創建階段使用值進行初始化的機制稱為Variable Hoisting(變量提升)。

特殊值undefined意味著聲明了一個變量但沒有賦值。

如果我們為變量分配一個這樣的值:

  1. name = 'freeCodeCamp'

執行階段會將這個值賦給變量。

JavaScript 中的函數提升

現在讓我們談談Function Hoisting(函數提升)。它與Variable Hoisting的模式相同。

執行上下文的創建階段將函數聲明放入內存,并在執行階段執行。請看下面的例子:

  1. // Invoke the function functionA 
  2. functionA(); 
  3.  
  4. // Declare the function functionA 
  5. function functionA() { 
  6. console.log('Function A'); 
  7. // Invoke the function FunctionB     
  8. functionB(); 
  9.  
  10. // Declare the function FunctionB 
  11. function functionB() { 
  12. console.log('Function B'); 

輸出如下:

  1. Function A 
  2. Function B 

執行上下文為函數創建內存并將整個函數聲明functionA放入其中。

函數創建自己的執行上下文。所以類似的事情也發生了functionB。

接下來,函數分別在它們的執行上下文中執行。

在創建階段將整個函數聲明提前放入內存稱為Function Hoisting。

一些基本規則

既然我們了解了變量提升的概念,那么讓我們了解一些基本規則:

  • 在代碼中使用變量和函數之前,務必先定義它們。這將減少意外的錯誤,為您的調試減少麻煩。
  • 提升僅用于函數聲明,而不用于初始化。這是一個函數初始化的例子,代碼執行會中斷。
  1. logMe(); 
  2.  
  3. var logMe = function() { 
  4.  console.log('Logging...'); 

代碼執行將中斷,因為在函數初始化時,變量logMe將作為變量而不是函數被提升。因此,對于變量提升,內存分配將在初始化時發生undefined。這就是我們會得到錯誤的原因:

函數初始化時出錯

假設我們嘗試在聲明之前訪問一個變量,然后使用letandconst關鍵字來聲明它。在這種情況下,它們將被提升但不會被分配默認值undefined。訪問此類變量將導致ReferenceError. 下面是一個例子:

  1. console.log(name); 
  2. let name

它會拋出錯誤:

使用 let 和 const 關鍵字聲明的提升變量時出錯

如果我們使用var代替let和,相同的代碼將毫無問題地運行const。這個錯誤是因為新的JavaScript 語言的保護機制,防止意外提升可能會導致不必要的麻煩。

感謝您能看到最后,我希望這篇文章能幫助您更好的理解JavaScript中的執行上下文與變量提升的機制。

原文:https://www.freecodecamp.org/news/javascript-execution-context-and-hoisting/

 

責任編輯:武曉燕 來源: 新鈦云服
相關推薦

2022-09-14 13:13:51

JavaScript上下文

2019-03-14 08:00:00

JavaScript執行棧前端

2017-05-11 14:00:02

Flask請求上下文應用上下文

2020-07-24 10:00:00

JavaScript執行上下文前端

2021-05-27 07:02:05

JavaScript代碼設施

2025-04-07 01:02:00

GoAPI語言

2024-04-07 08:50:00

谷歌框架

2012-12-31 10:01:34

SELinuxSELinux安全

2012-07-18 11:39:18

ibmdw

2015-07-08 10:25:05

Javascript上下文作用域

2015-10-09 09:43:28

CSS CSS3

2022-09-15 08:01:14

繼承基礎設施基礎服務

2023-07-11 10:02:23

2020-06-22 08:41:34

JS語言代碼

2025-05-07 08:35:11

2025-10-13 08:00:00

2022-04-24 15:37:26

LinuxCPU

2025-10-31 01:00:00

2024-03-14 08:11:45

模型RoPELlama

2023-05-05 07:41:42

執行上下文JavaScript
點贊
收藏

51CTO技術棧公眾號

99se视频在线观看| 最近中文字幕在线免费观看| 在线日韩成人| 亚洲成人一区二区在线观看| 九九九九九九精品| 正在播放木下凛凛xv99| 欧美 日韩 国产精品免费观看| 欧美tk丨vk视频| 欧美日韩亚洲一二三| 久cao在线| 91免费在线视频观看| 国产精品你懂得| 国产真人真事毛片| 日韩精品一区二区三区免费观影| 日韩一级二级三级精品视频| av免费观看网| 国产网站在线免费观看| 91美女蜜桃在线| 91久久在线观看| 久久久久久少妇| 欧美成人自拍| 亚洲欧美日韩精品久久亚洲区 | 国产色综合网| 色偷偷88888欧美精品久久久| 性色av蜜臀av浪潮av老女人| 国产亚洲欧美日韩精品一区二区三区| 亚洲尤物视频在线| 亚洲精品二区| 婷婷亚洲一区二区三区| 国产精品综合一区二区三区| 国产精品久久久久999| 久久精品国产av一区二区三区| 日韩免费高清| 亚洲欧美精品在线| www.17c.com喷水少妇| 成人短视频软件网站大全app| 欧美日韩亚洲系列| 成人污网站在线观看| 中文日本在线观看| 国产亚洲制服色| 狠狠色狠狠色综合人人| 精品久久国产视频| 激情六月婷婷综合| 国产在线精品一区免费香蕉| av一级在线观看| 国产精品女主播一区二区三区| 欧美精品一区二区免费| 人妻aⅴ无码一区二区三区| 青草综合视频| 欧美三级日韩三级| 九一精品在线观看| 国产精品亚洲一区二区三区在线观看| 精品国产乱码久久久久酒店 | 在线观看xxx| 狠狠色狠狠色综合系列| 国产精品一区久久| 亚洲无码精品国产| 麻豆一区二区99久久久久| 国产福利视频一区| 在线免费一区二区| 日产国产高清一区二区三区| 国产精品久久色| 中文字字幕在线中文乱码| 日韩高清不卡一区二区| 国产精品夫妻激情| 中文字幕人妻精品一区| 麻豆成人av在线| 国产日韩av高清| 国产又黄又爽视频| 国产麻豆精品95视频| 99re在线观看视频| 天天色综合av| 久久夜色精品一区| 日韩高清dvd| 91电影在线播放| 亚洲男帅同性gay1069| 精品视频在线观看一区二区| 人人澡人人添人人爽一区二区| 亚洲一区二区三区精品在线| 91精品国产91久久久久麻豆 主演| www.51av欧美视频| 一本到高清视频免费精品| 亚洲激情在线观看视频| 精品成人18| 亚洲国产美女久久久久| 伊人网伊人影院| 香蕉综合视频| 午夜精品一区二区三区av| 无码人妻熟妇av又粗又大| 蜜臀av在线播放一区二区三区| 成人中文字幕在线观看| 国模无码一区二区三区| 久久久精品黄色| 波多野结衣三级在线| jizzjizz中国精品麻豆| 欧美在线短视频| 久久久国产精品久久久| 校园春色另类视频| 久久久国产精彩视频美女艺术照福利| 懂色av.com| 日本va欧美va欧美va精品| 99porn视频在线| 国产精品影院在线| 香蕉av福利精品导航| 日本888xxxx| av综合网站| 一区国产精品视频| 日本三级2019| 精油按摩中文字幕久久| 国产在线视频欧美一区二区三区| av在线女优影院| 五月婷婷久久丁香| 国产精品久久久久久久av福利| 国产精品任我爽爆在线播放| 视频一区在线播放| 国产精品久久久久久久岛一牛影视 | 久久亚洲a v| www成人在线视频| 精品国产成人系列| 久久爱一区二区| 久久精品午夜| 国产欧美日韩伦理| av色综合久久天堂av色综合在| 色老综合老女人久久久| 日韩综合第一页| 亚洲影视一区二区三区| 国产精品久久久久久中文字| 国产精品国产高清国产| 亚洲图片欧美视频| 国产欧美精品一二三| 不卡在线一区二区| 欧日韩在线观看| 嫩草影院一区二区| 亚洲图片欧美视频| 国产无套精品一区二区三区| 99精品全国免费观看视频软件| 国产成人一区二区| 天堂网www中文在线| 五月天国产精品| 中文字幕人妻熟女在线| 中文视频一区| 91色p视频在线| 国产美女在线观看| 欧美精品乱码久久久久久| 亚洲高潮女人毛茸茸| 日韩成人一区二区三区在线观看| 久久一区二区三区av| 福利影院在线看| 精品国产乱码久久久久久久久| 麻豆亚洲av成人无码久久精品| 国产在线精品国自产拍免费| 国产又粗又爽又黄的视频| 亚洲成a人片777777久久| 中文字幕在线日韩 | 极品久久久久久久| 久久免费黄色| 日韩久久不卡| 国模私拍国内精品国内av| 国产亚洲欧洲高清一区| 少妇一级淫片日本| 国产精品女人毛片| 黑人巨大猛交丰满少妇| 欧美精品黄色| 国产伦精品一区二区三区照片| 888av在线视频| 日韩电影中文字幕在线| 日日骚av一区二区| 欧美经典一区二区三区| 亚洲免费成人在线视频| 欧美福利专区| 狠狠色综合一区二区| av日韩电影| 中文字幕日韩高清| 国产视频第一页| 亚洲成人免费在线观看| 中文字字幕码一二三区| 日本少妇一区二区| 在线观看污视频| 狠狠久久伊人| 国产精品久久久久久久久久新婚| 毛片在线不卡| 亚洲大胆人体av| 无码人妻精品一区二区三区蜜桃91| 国产欧美日韩亚州综合| www,av在线| 日韩视频在线一区二区三区 | 欧美性生交xxxxxdddd| 先锋影音av在线| 国产精品综合视频| 免费高清在线观看免费| 久久一区二区三区喷水| 97人摸人人澡人人人超一碰| 伊人成综合网站| 色哟哟网站入口亚洲精品| 丰满少妇一级片| 91极品视觉盛宴| 青青草原国产视频| 国产欧美一区二区三区在线看蜜臀| www.com污| 亚洲永久字幕| 国产又粗又大又爽的视频| 一本色道久久综合狠狠躁的番外| 成人妇女淫片aaaa视频| 日韩深夜视频| 久久99热精品| 成人在线免费观看| 亚洲第一天堂av| 国产乱色精品成人免费视频 | 久久亚洲捆绑美女| 中文字幕avav| 秋霞国产午夜精品免费视频| 成人免费播放器| 四虎永久在线观看| 国产午夜精品一区二区三区欧美 | 免费看91视频| 美女视频黄久久| 日本一区二区黄色| 亚洲国产1区| 日韩精品一区二区三区电影| 国产一区二区欧美| 国产一区在线观| 激情综合婷婷| 成人网页在线免费观看| 欧美一区免费视频| 两个人看的在线视频www| 久久久国产影院| 黄色电影免费在线看| 精品女同一区二区| 国产黄色一级大片| 欧美日韩日日夜夜| 精品成人无码久久久久久| 性做久久久久久免费观看欧美| 黄色录像二级片| 国产精品嫩草影院com| 西西444www无码大胆| 99久免费精品视频在线观看 | 欧美亚韩一区二区三区| 亚洲欧美电影一区二区| 成人18视频免费69| 国产精品毛片久久久久久| 国产又粗又猛又爽视频| 久久先锋资源网| 日本japanese极品少妇| 成人av在线观| 国产伦精品一区二区三区88av| 国产精品综合久久| 又大又长粗又爽又黄少妇视频| 国内不卡的二区三区中文字幕| 老司机午夜性大片| 久国产精品韩国三级视频| 欧美日韩中文不卡| 紧缚捆绑精品一区二区| 99久久99精品| 国产在线不卡一区| 少妇极品熟妇人妻无码| 成人午夜在线视频| 喷水视频在线观看| 91香蕉视频黄| 亚洲精品国产精品国自产网站| 国产欧美日韩视频在线观看| 农村老熟妇乱子伦视频| 亚洲欧洲99久久| 91porn在线视频| 亚洲成人一区二区在线观看| 中文字幕精品无码一区二区| 色狠狠av一区二区三区| 中文字幕在线观看国产| 在线不卡中文字幕播放| 性生交生活影碟片| 亚洲国产毛片完整版| 国产九九在线| 久久精视频免费在线久久完整在线看| a级影片在线观看| 97在线精品视频| 全球最大av网站久久| 成人网在线视频| 国产精品xxx在线观看| 欧美一区二区福利| 97精品国产| 精品无码一区二区三区爱欲| 久久精品系列| 午夜免费福利网站| www久久精品| 国产一级淫片久久久片a级| 亚洲激情欧美激情| 欧美特黄aaaaaa| 欧美精品久久久久久久多人混战 | 国产激情91久久精品导航| 无码精品一区二区三区在线播放| 国产三级精品视频| 特级片在线观看| 色综合久久久久| 一级aaaa毛片| 亚洲电影中文字幕| 9191在线| 久久男人资源视频| 成人在线免费电影网站| 肥熟一91porny丨九色丨| 国产欧美亚洲精品a| 久艹在线免费观看| 久久99国产精品久久99| 日本免费福利视频| 亚洲精品中文在线影院| 免费看一级视频| 日韩精品影音先锋| aaa在线观看| 91国产一区在线| 国产专区精品| 亚洲精品9999| 亚洲一区二区毛片| aaa黄色大片| 国产精品麻豆99久久久久久| 日韩av一区二区在线播放| 欧美日韩一区二区三区不卡| 天天摸天天干天天操| 欧美精品制服第一页| 成人黄色免费观看| 免费观看成人高| 亚洲国产激情| 自拍一级黄色片| 中日韩免费视频中文字幕| 狠狠躁夜夜躁人人爽天天高潮| 6080日韩午夜伦伦午夜伦| 巨骚激情综合| 777精品视频| swag国产精品一区二区| 一级全黄肉体裸体全过程| 日韩av成人高清| 全黄一级裸体片| 欧美色视频日本高清在线观看| 性生活免费网站| 欧美大胆a视频| 91麻豆精品国产综合久久久 | 91丨porny丨首页| 日本在线一级片| 欧美日韩亚洲综合一区二区三区| 欧美套图亚洲一区| 97在线免费视频| 久久草在线视频| 日本欧美视频在线观看| 国产成人av一区二区| 欧美成欧美va| 欧美一区二区三区在线观看视频 | 国内精品一区二区三区四区| 视频二区欧美| 欧美在线观看视频免费| 国产精品一区二区在线看| 亚洲国产123| 欧美一区二区三区小说| 2021国产在线| 国产精品日韩欧美一区二区三区 | 色与欲影视天天看综合网| 精品国产乱码久久久久久樱花| 影音先锋亚洲视频| 激情综合色综合久久综合| 欧美激情图片小说| 精品少妇一区二区| 第一福利在线视频| 日本一区二区免费看| 日韩国产高清在线| 国产精品suv一区二区88 | 先锋av资源站| 欧美夜福利tv在线| 国内精品伊人久久久| 五月婷婷六月丁香激情| 亚洲欧洲国产专区| 俄罗斯嫩小性bbwbbw| 1769国内精品视频在线播放| 免费成人高清在线视频theav| 国产视频在线视频| 国产精品国产a| 成人黄色在线观看视频| 97在线观看视频国产| 狠狠做深爱婷婷综合一区| 奇米视频7777| 亚洲一区二区在线观看视频| 三级国产在线观看| 国产精品视频在线播放| 亚洲最大av| 538国产视频| 欧美日韩另类国产亚洲欧美一级| 成人在线免费看黄| 精品免费二区三区三区高中清不卡 | 久久免费电影网| 一本一道人人妻人人妻αv| 欧美国产精品va在线观看| 视频福利一区| 久国产精品视频| 亚洲成av人综合在线观看| 国产无套粉嫩白浆在线2022年| 国产在线观看不卡| 亚洲精品一二| 黄色av片三级三级三级免费看| 日韩免费观看高清完整版在线观看| 中文在线资源| 天堂av免费看| 久久色.com| 精品久久无码中文字幕| 国产精品96久久久久久又黄又硬| 欧美激情视频一区二区三区免费|