日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript中的執(zhí)行上下文和變量提升

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)絡空間、營銷軟件、網(wǎng)站建設、梁園網(wǎng)站維護、網(wǎng)站推廣。

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

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

  • 執(zhí)行上下文
  • 變量提升

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

JavaScript 中的執(zhí)行上下文

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

語法環(huán)境決定了我們?nèi)绾我约霸诤翁幘帉懘a。看看下面的代碼:

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

在上面的代碼中,變量age在語法上位于函數(shù)內(nèi)部doSomething。

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

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

查看下圖以了解語法環(huán)境和執(zhí)行上下文之間的區(qū)別:

語法環(huán)境與執(zhí)行上下文

那么在執(zhí)行上下文中到底發(fā)生了什么?代碼被逐行解析,生成可執(zhí)行的字節(jié)碼,分配內(nèi)存并執(zhí)行。

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

 
 
 
 
  1. var age = 7; 

這段源代碼在最終執(zhí)行之前經(jīng)歷了以下階段:

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

下面的動畫圖片顯示了源代碼到可執(zhí)行字節(jié)碼的轉換。

可執(zhí)行字節(jié)碼的源代碼

所有這些事情都發(fā)生在一個執(zhí)行上下文中。所以執(zhí)行上下文是代碼的特定部分的執(zhí)行環(huán)境。

有兩種類型的執(zhí)行上下文:

  • 全局執(zhí)行上下文 (GEC)
  • 函數(shù)執(zhí)行上下文 (FEC)

每個執(zhí)行上下文都有兩個階段:

  • 創(chuàng)建階段
  • 執(zhí)行階段

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

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

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

創(chuàng)建階段

在創(chuàng)建階段,創(chuàng)建了兩個獨特的東西:

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

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

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

執(zhí)行階段

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

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

示例 1:加載空腳本

創(chuàng)建一個名為index.js的空 JavaScript 文件及一個包含以下內(nèi)容的 HTML 文件:

 
 
 
 
  1.  
  2.  
  3.  
  4.     
  5.     
  6.     
  7.    Document 
  8.     
  9.  
  10.  
  11.   I'm loading an empty script 
  12.  
  13.  

我們使用