精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本不卡1234视频| 国产99对白在线播放| 九九精品在线| 欧美日韩成人在线一区| 日韩一级特黄毛片| 欧美精品少妇| 国产精品资源在线观看| 7777kkkk成人观看| 毛片久久久久久| 999在线精品| 色激情天天射综合网| 99久re热视频精品98| 婷婷五月综合激情| 久久99精品久久久久久动态图 | 97超碰免费在线| 久久精品一区二区三区四区| 91aaaa| 久久精品99北条麻妃| 合欧美一区二区三区| 中文日韩电影网站| 国产麻豆剧传媒精品国产av| 中文成人激情娱乐网| 欧美色图在线视频| 精品久久久无码人妻字幂| 成人三级黄色免费网站| 99re成人精品视频| 亚洲中国色老太| 中文字幕视频免费观看| 亚洲综合欧美| 97色伦亚洲国产| 波多野结衣不卡视频| 欧美少妇xxxx| 亚洲色图偷窥自拍| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 国产精品美女一区二区在线观看| 黑人巨大精品欧美一区二区小视频| 国产又大又黑又粗| 理论片日本一区| 国产精品久久久久久中文字| 国产成人一级片| 国产日韩欧美一区在线| 欧美激情综合色综合啪啪五月| 少妇高潮在线观看| 91亚洲国产高清| 中文字幕精品一区二区精品| 欧美多人猛交狂配| 欧美一级一片| 亚洲精品不卡在线| 国产老熟女伦老熟妇露脸| 东京久久高清| 亚洲精品国产综合区久久久久久久| 日本精品一二三| 7m精品国产导航在线| 欧美精品一区男女天堂| 午夜免费福利影院| 欧美日韩精品一区二区三区在线观看| 亚洲成人av在线播放| 中文字幕人妻一区二区三区| 国产女人18毛片水真多18精品| 欧美精品一区二区三区很污很色的 | 日本欧美韩国| 欧美色视频一区| 亚洲免费av一区| 国产成人视屏| 日韩精品中文字幕一区 | 国产午夜精品福利| 亚洲精品中文字幕在线| 日本中文字幕在线2020| 亚洲天天做日日做天天谢日日欢 | а√天堂在线官网| 亚洲制服丝袜一区| 日本www在线视频| 欧美黑人粗大| 欧美另类一区二区三区| 久草福利在线观看| 国偷自产视频一区二区久| 日韩av在线网站| 东方伊人免费在线观看| 99热在线成人| 国内精品一区二区三区| 天码人妻一区二区三区在线看| 视频一区在线播放| 91精品视频免费看| 欧美一级淫片aaaaaa| 久久精品亚洲国产奇米99| 9999在线观看| www.综合| 欧美日韩一级视频| 白嫩情侣偷拍呻吟刺激| 欧美精品色图| 欧美激情喷水视频| 无码人妻精品一区二区| 国产美女娇喘av呻吟久久| 国产伦精品一区二区| av在线免费播放网站| 亚洲麻豆国产自偷在线| www.玖玖玖| 国产精品成人3p一区二区三区| 亚洲成人av片| 91香蕉一区二区三区在线观看| 国户精品久久久久久久久久久不卡| 欧美一区二区三区图| 国产精品日韩无码| 久久久天堂av| 国产欧美久久久久| 成人自拍av| 亚洲第一男人av| 久草福利资源在线| 一区二区福利| 99久久无色码| 永久免费av片在线观看全网站| 亚洲午夜免费电影| 男生操女生视频在线观看| 日韩高清一级| 欧美激情视频给我| 国产精品毛片久久久久久久av| 99久久er热在这里只有精品15| 婷婷视频在线播放| 日本国产欧美| 国产丝袜高跟一区| 国产在线观看免费视频今夜| 另类小说一区二区三区| 日本成人看片网址| 高端美女服务在线视频播放| 欧美一二三区在线观看| 国产精品无码无卡无需播放器| 夜夜嗨一区二区三区| 97神马电影| 免费a在线看| 欧美色图一区二区三区| 久久久久亚洲av无码a片| 日韩亚洲国产欧美| 国产精品初高中精品久久| 国产激情在线观看| 精品视频色一区| 国产精品成人无码免费| 久久久人人人| 免费国产在线精品一区二区三区| 国产网红女主播精品视频| 日韩天堂在线观看| 破处女黄色一级片| 国产一区二区三区国产| 五月天男人天堂| 亚洲精品aa| 久久香蕉国产线看观看av| 在线观看中文字幕码| 中国色在线观看另类| 五月天亚洲视频| 日韩欧美在线中字| 成人精品在线观看| 中文字幕免费高清电视剧网站在线观看| 欧美日本在线播放| 日韩在线观看免| 国产一区二区在线免费观看| 黄色影视在线观看| 999在线精品| 91超碰caoporn97人人| 无码h黄肉3d动漫在线观看| 亚洲va天堂va国产va久| xxxx黄色片| 久久久久久亚洲精品杨幂换脸| 久久久久久九九九九| 成人动漫一区| 这里只有视频精品| 国产精品天天操| 一区二区三区四区亚洲| 国产在线观看免费播放| 国产精品试看| 亚洲春色综合另类校园电影| 啪啪av大全导航福利综合导航| 久久精品国产亚洲一区二区| www.色日本| 无吗不卡中文字幕| 舐め犯し波多野结衣在线观看| 奇米四色…亚洲| 先锋影音男人资源| 久久97久久97精品免视看秋霞| 欧美中文字幕在线观看| av在线天堂| 精品国产一区a| 极品国产91在线网站| 18欧美亚洲精品| 国产清纯白嫩初高中在线观看性色| 久久av一区| 一区一区视频| 精品综合久久88少妇激情| 国产成人亚洲精品| √天堂8在线网| 亚洲欧美国产精品久久久久久久 | 欧美brazzers| 一区二区三区在线不卡| 欧美深性狂猛ⅹxxx深喉 | 人妻体体内射精一区二区| 久久xxxx| 久久久久久久香蕉| av在线不卡免费观看| 俄罗斯精品一区二区三区| 国模一区二区| 久久免费在线观看| 日本最黄一级片免费在线| 日韩精品中文字幕久久臀| 一起草av在线| 欧美性猛交xxxx| 欧美日韩在线视频免费播放| 国产亚洲欧美色| 一区二区在线免费观看视频| 日本强好片久久久久久aaa| 香港三级日本三级a视频| 久久资源中文字幕| 九九九九九精品| 日韩一二三区| 国产九九精品视频| 日韩成人影音| 555www成人网| 2019中文字幕在线电影免费| 久久午夜a级毛片| av中文天堂在线| 亚洲免费电影一区| 你懂的网站在线| 日韩欧美区一区二| 91av久久久| 在线亚洲高清视频| 六月丁香激情综合| 性欧美大战久久久久久久久| 农村妇女精品一区二区| 国产精品伦理在线| 国产精品一二三区在线观看| 97久久精品人人爽人人爽蜜臀| 午夜免费视频网站| 麻豆91小视频| 中文字幕 91| 日韩中文字幕麻豆| 大肉大捧一进一出好爽视频| 亚洲精品专区| 国产一区二区视频播放| 欧美另类综合| 2022中文字幕| 欧美激情一区| 高清无码视频直接看| 欧美久久一区| 日本香蕉视频在线观看| 欧美一区二区三区免费看| 特大黑人娇小亚洲女mp4| 91精品啪在线观看国产81旧版| 一区二区免费电影| 五月婷婷亚洲| 在线播放 亚洲| 欧美一区二区三区免费看| 久久观看最新视频| 国产精品porn| 国产精品国产对白熟妇| 亚洲成人资源| 日本久久久精品视频| 午夜综合激情| 在线免费观看视频黄| 免费在线观看一区二区三区| 成人黄色一级大片| 国产一区二区三区在线观看免费 | 青青色在线视频| 亚洲人成伊人成综合网久久久| 你懂的在线免费观看| 亚洲天天在线日亚洲洲精| 国产黄在线播放| www.欧美精品一二三区| 伊人影院在线视频| 久久久亚洲影院你懂的| 黑人精品一区| 国产精品一区二区三| 激情综合五月| 激情小说综合网| 欧美精选视频在线观看| 做爰高潮hd色即是空| 亚洲午夜激情在线| 免费裸体美女网站| 激情av综合网| 超碰97在线资源站| 国产精品热久久久久夜色精品三区| 亚洲欧美另类日本| 亚洲一区二区欧美日韩| 中文字幕一区二区人妻电影| 欧美精品久久天天躁| 免费激情视频网站| 爽爽爽爽爽爽爽成人免费观看| 伊人影院在线视频| 国产成人精品免费久久久久| 国产一区二区久久久久| 久久天天狠狠| 影视亚洲一区二区三区| 免费无码不卡视频在线观看| 久久99久久久久| 久久久久久久无码| 亚洲色图欧美在线| 亚洲激情视频一区| 欧美网站一区二区| 日韩一级片免费在线观看| 中文字幕亚洲情99在线| 成av人片在线观看www| 国产一区二区香蕉| 日韩av中文字幕一区| 中文字幕一区二区三区精彩视频| 99国产精品99久久久久久粉嫩| 久久这里只精品| 97se亚洲国产综合自在线观| 国产成人av免费在线观看| 日韩欧美在线免费| 性猛交富婆╳xxx乱大交天津| 一级做a爰片久久毛片美女图片| 青青在线视频| 成人国产精品一区| 精品国产一区探花在线观看| 欧美乱做爰xxxⅹ久久久| 久久精品国产在热久久| 日本黄色特级片| 亚洲国产人成综合网站| 国产麻豆91视频| 国产一区二区三区在线观看网站| 丰乳肥臀在线| 亚洲在线观看视频| 99久久夜色精品国产亚洲96| 久久精品视频91| 2024国产精品| 日韩高清免费av| 精品福利av导航| 在线午夜影院| 91中文在线观看| 99九九热只有国产精品| 免费涩涩18网站入口| 久久日韩粉嫩一区二区三区 | 精品视频免费看| 国产粉嫩一区二区三区在线观看| 91高清视频在线免费观看| 中文字幕亚洲在线观看| 蜜桃网站在线观看| 国产乱码精品一区二区三区av| 国产一区第一页| 欧美三级午夜理伦三级中视频| 黄色av网址在线免费观看| 欧美一二三视频| 日韩大片在线免费观看| 久久久久久免费看| 北条麻妃国产九九精品视频| 一区二区三区免费高清视频| 精品日韩欧美一区二区| 日本高清成人vr专区| 成人三级在线| 亚洲欧洲另类| 日本黄色网址大全| 色综合天天综合网天天看片| 国产中文字幕在线播放| 国产成人精品优优av| 大色综合视频网站在线播放| 午夜久久久精品| 亚洲色图清纯唯美| 蜜臀av午夜精品| 午夜精品久久久久久久久久久久久| 国产精品丝袜在线播放| 国产精品一区二区免费在线观看| 久久久精品黄色| 中文字幕一区二区人妻痴汉电车| 色妞色视频一区二区三区四区| 高清精品久久| avav在线播放| 337p粉嫩大胆噜噜噜噜噜91av | 亚洲成色999久久网站| 亚洲色图官网| 亚洲国产欧美日韩| 国产一区二区按摩在线观看| 国产一级一级片| 亚洲男女性事视频| 欧美xxxx性| www.成年人视频| 国产亲近乱来精品视频| 在线免费看毛片| 欧美激情小视频| 国产一区二区观看| 福利视频999| 亚洲成人av一区二区| 九色在线免费| 91久久精品国产91久久性色| 激情综合激情| 欧美 日韩 成人| 日韩欧美中文字幕精品| 在线观看欧美日韩电影| 影音先锋欧美在线| 成人动漫av在线| 在线播放精品视频| 久久免费视频这里只有精品| 日本一本不卡| 久久久久亚洲无码| 欧美这里有精品| 国产后进白嫩翘臀在线观看视频 | 亚洲精品传媒| 狠狠综合久久av| 韩日av一区二区| 国产免费av一区| 欧美成在线观看| 欧美日韩在线网站| xxxxxx黄色| 欧美二区三区的天堂| 欧美magnet|