新聞中心
本文轉載自微信公眾號「新鈦云服」,作者林泓輝 翻譯。轉載本文請聯(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。看看下面的代碼:
- function doSomething() {
- var age= 7;
- // 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ā)生什么?
- 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 文件:
Document - I'm loading an empty script
我們使用


咨詢
建站咨詢