日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

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

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

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

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

作為一個(gè)初學(xué)者的JavaScript,了解這些概念將有助于您了解this關(guān)鍵字,作用域和閉包。

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

一般來(lái)說(shuō),一個(gè) JavaScript 源文件會(huì)有多行代碼。作為開(kāi)發(fā)人員,我們將代碼組織成變量、函數(shù)、數(shù)據(jù)結(jié)構(gòu)(如對(duì)象和數(shù)組)等等。

語(yǔ)法環(huán)境決定了我們?nèi)绾我约霸诤翁幘帉懘a??纯聪旅娴拇a:

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

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

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

幫助代碼執(zhí)行的環(huán)境稱為執(zhí)行上下文。它是當(dāng)前正在運(yùn)行的代碼,以及有助于運(yùn)行它的一切??梢杂泻芏嗾Z(yǔ)法環(huán)境,但當(dāng)前運(yùn)行的代碼只能有一個(gè)執(zhí)行上下文。

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

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

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

讓我們采用我們?cè)谏厦婵吹降南嗤瘮?shù)。您認(rèn)為執(zhí)行以下行時(shí)可能會(huì)發(fā)生什么?

 
 
 
 
  1. var age = 7; 

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

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

下面的動(dòng)畫(huà)圖片顯示了源代碼到可執(zhí)行字節(jié)碼的轉(zhuǎn)換。

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

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

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

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

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

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

讓我們?cè)敿?xì)看看它們中的每一個(gè),并更好地理解它們。

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

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

創(chuàng)建階段

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

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

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

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

執(zhí)行階段

代碼執(zhí)行在這個(gè)階段開(kāi)始。在這里進(jìn)行全局變量的賦值。請(qǐng)注意,這里沒(méi)有調(diào)用函數(shù),因?yàn)樗l(fā)生在函數(shù)執(zhí)行上下文中。我們將在后面討論這個(gè)問(wèn)題。

讓我們通過(guò)幾個(gè)例子來(lái)理解這兩個(gè)階段。

示例 1:加載空腳本

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

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

我們使用