亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

深入探討JavaScript的最基本部分之執行上下文

2024-05-06 16:48:05
字體:
來源:轉載
供稿:網友

在這篇文章中,我將深入探討JavaScript的最基本部分之一,即Execution Context(執行上下文)。 在本文結束時,你應該對解釋器了解得更清楚:為什么在聲明它們之前可以使用某些函數或變量?以及它們的值是如何確定的?

什么是執行上下文?

JavaScript的執行環境非常重要,當JavaScript代碼在行時,會被預處理為以下情況之一:

  • Global code - 首次執行代碼的默認環境。
  • Function code - 每當執行流程進入函數體時。
  • Eval code - 要在eval函數內執行的文本。

你可以閱讀大量涉及作用域的在線資料,不過為了使事情更容易理解,讓我們將術語“執行上下文”視為當前代碼的運行環境或作用域。接下來讓我們看一個包含global和function / local上下文的代碼示例。

JavaScript,執行上下文

這里沒有什么特別之處,我們有一個由紫色邊框表示的全局上下文,和由綠色,藍色和橙色邊框表示的3個不同的函數上下文。 只能有1個全局上下文,可以從程序中的任何其他上下文訪問。

你可以擁有任意數量的函數上下文,并且每個函數調用都會創建一個新的上下文,從而創建一個私有作用域,其中無法從當前函數作用域外直接訪問函數內部聲明的任何內容。 在上面的示例中,函數可以訪問在其當前上下文之外聲明的變量,但外部上下文無法訪問在其中聲明的變量或函數。 為什么會這樣呢? 這段代碼究竟是如何處理的?

Execution Context Stack(執行上下文堆棧)

瀏覽器中的JavaScript解釋器被實現為單個線程。 實際上這意味著在瀏覽器中一次只能做一件事,其他動作或事件在所謂的執行堆棧中排隊。 下圖是單線程堆棧的抽象視圖:

JavaScript,執行上下文

我們已經知道,當瀏覽器首次加載腳本時,它默認進入全局上下文執行。 如果在全局代碼中調用函數,程序的順序流進入被調用的函數,創建新的執行上下文并將其推送到執行堆棧的頂部。

如果在當前函數中調用另一個函數,則會發生同樣的事情。 代碼的執行流程進入內部函數,該函數創建一個新的執行上下文,該上下文被推送到現有堆棧的頂部。 瀏覽器將始終執行位于堆棧頂部的當前執行上下文,并且一旦函數執行完當前執行上下文后,它將從棧頂部彈出,把控制權返回到當前棧中的下一個上下文。 下面的示例顯示了遞歸函數和程序的執行堆棧:

(function foo(i) {  if (i === 3) {    return;  }  else {    foo(++i);  }}(0));

JavaScript,執行上下文

代碼簡單地調用自身3次,并將i的值遞增1。每次調用函數foo時,都會創建一個新的執行上下文。 一旦上下文完成執行,它就會彈出堆棧并且講控制返回到它下面的上下文,直到再次達到全局上下文。

關于執行堆棧execution stack有5個關鍵要點:

  1. 單線程。
  2. 同步執行。
  3. 一個全局上下文。
  4. 任意多個函數上下文。
  5. 每個函數調用都會創建一個新的執行上下文execution context,甚至是對自身的調用。

執行上下文的細節

所以我們現在知道每次調用一個函數時,都會創建一個新的執行上下文。 但是,在JavaScript解釋器中,對執行上下文的每次調用都有兩個階段:

創建階段 [調用函數時,但在執行任何代碼之前]:

  1. 創建作用域鏈。
  2. 創建變量,函數和參數。
  3. 確定“this”的值。

激活/代碼執行階段:

  • 分配值,引用函數和解釋/執行代碼。

可以將每個執行上下文在概念上表示為具有3個屬性的對象:

executionContextObj = {  'scopeChain': { /* variableObject + 所有父執行上下文的variableObject */ },  'variableObject': { /* 函數實參/形參,內部變量和函數聲明 */ },  'this': {}}

激活對象/變量對象 [AO/VO]

在調用該函數,并且在實際執行函數之前,會創建這個executionContextObj。 這被稱為第1階段,即創造階段。 這時解釋器通過掃描函數傳遞的實參或形參、本地函數聲明和局部變量聲明來創建executionContextObj。 此掃描的結果將成為executionContextObj中的variableObject。

以下是解釋器如何預處理代碼的偽代碼概述:

1.找一些代碼來調用一個函數。

2.在執行功能代碼之前,創建執行上下文。

3.進入創建階段:

    ①初始化作用域鏈。

    ②創建variable object:

  • 創建arguments object,檢查參數的上下文,初始化名稱和值并創建引用副本。
  • 掃描上下文以獲取函數聲明:
  • 對于找到的每個函數,在variable object中創建一個屬性,該屬性是函數的確切名稱,該屬性存在指向內存中函數的引用指針。
  • 如果函數名已存在,則將覆蓋引用指針值。
  • 掃描上下文以獲取變量聲明:
  • 對于找到的每個變量聲明,在variable object中創建一個屬性作為變量名稱,并將該值初始化為undefined。
  • 如果變量名稱已存在于variable object中,則不執行任何操作并繼續掃描。

    ③確定上下文中“this”的值。

4.激活/執行階段:

  • 在上下文中運行/解釋函數代碼,并在代碼逐行執行時分配變量值。

我們來看一個例子:

function foo(i) {  var a = 'hello';  var b = function privateB() {  };  function c() {  }}foo(22);

在調用foo(22)時,創建階段如下所示:

fooExecutionContext = {  scopeChain: { ... },  variableObject: {    arguments: {      0: 22,      length: 1    },    i: 22,    c: pointer to function c()    a: undefined,    b: undefined  },  this: { ... }}

如你所見,創建階段處理定義屬性的名稱,而不是為它們賦值,但正式的形參/實參除外。創建階段完成后,執行流程進入函數,激活/代碼執行階段在函數執行完畢后如下所示:

fooExecutionContext = {  scopeChain: { ... },  variableObject: {    arguments: {      0: 22,      length: 1    },    i: 22,    c: pointer to function c()    a: 'hello',    b: pointer to function privateB()  },  this: { ... }}

關于hoisting

你可以找到許多使用JavaScript定義術語hoisting的在線資源,解釋變量和函數聲明被hoisting到其函數范圍的頂部。 但是沒有人能夠詳細解釋為什么會發生這種情況,掌握了關于解釋器如何創建激活對象的新知識,很容易理解為什么。 請看下面的代碼示例:

(function() {  console.log(typeof foo); // function pointer  console.log(typeof bar); // undefined  var foo = 'hello',    bar = function() {      return 'world';    };  function foo() {    return 'hello';  }}());

我們現在可以回答的問題是:

為什么我們可以在聲明foo之前就能訪問?

  • 如果我們理解了創建階段,就知道在激活/代碼執行階段之前已經創建了變量。因此,當函數流開始執行時,已經在激活對象中定義了foo。

Foo被聲明兩次,為什么foo顯示為function而不是undefined或string?

  • 即使foo被聲明兩次,我們通過創建階段知道函數在變量之前就被創建在激活對象上了,而且如果激活對象上已經存在了屬性名稱,我們只是繞過了聲明這一步驟。
  • 因此,首先在激活對象上創建對函數foo()的引用,并且當解釋器到達var foo時,我們已經看到屬性名稱foo存在,因此代碼不執行任何操作并繼續處理。

為什么bar未定義?

  • bar實際上是一個具有函數賦值的變量,我們知道變量是在創建階段被創建的,但它們是使用undefined值初始化的。

希望到這里你已經能夠很好地掌握了JavaScript解釋器如何預處理你的代碼。 理解執行上下文和堆??梢宰屇懔私獗澈蟮脑颍簽槭裁创a預處理后的值和你預期的不一樣。

你認為學習解釋器的內部工作原理是多此一舉還是非常必要的呢? 了解執行上下文階段是否能夠幫你你寫出更好的JavaScript呢?

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线999| 92看片淫黄大片看国产片| 亚洲欧洲日产国码av系列天堂| 久久久久久久久久久人体| 欧美日韩国产中文精品字幕自在自线| 欧美大成色www永久网站婷| 这里精品视频免费| 91国产视频在线播放| 欧美一区二三区| 在线看欧美日韩| 久久久久久久国产精品视频| 欧美日韩久久久久| 精品日韩中文字幕| 国产a∨精品一区二区三区不卡| 国产成人精品免高潮费视频| 中文国产亚洲喷潮| 中文精品99久久国产香蕉| 国产精品jvid在线观看蜜臀| 久久久av亚洲男天堂| 国产精品久久久久7777婷婷| 国产91色在线|| 蜜臀久久99精品久久久无需会员| 91九色单男在线观看| 日韩免费看的电影电视剧大全| 在线播放国产精品| 91老司机精品视频| 国产视频精品免费播放| zzjj国产精品一区二区| 成人av在线天堂| 57pao成人永久免费视频| 亚洲直播在线一区| 日韩欧美福利视频| 国产精品电影在线观看| 色偷偷av亚洲男人的天堂| 亚洲国产成人精品女人久久久| 国产精品xxx视频| 日韩在线观看av| 亚洲欧美激情在线视频| 成人有码视频在线播放| 欧美激情视频免费观看| 黑人精品xxx一区一二区| 日韩大陆欧美高清视频区| 欧美大胆在线视频| 国产精品一区二区三区久久| 亚洲人成网在线播放| 欧美国产日产韩国视频| 日韩精品小视频| 国产日韩欧美在线视频观看| 日韩精品久久久久| 久久久久久一区二区三区| 亚洲国产一区二区三区在线观看| 欧美亚洲激情视频| 国产不卡一区二区在线播放| 91免费看片在线| 国产啪精品视频| 亚洲精品之草原avav久久| 九九久久国产精品| 欧美激情精品久久久久久黑人| 日韩中文在线不卡| 欧美激情影音先锋| 日韩亚洲国产中文字幕| 亚洲va国产va天堂va久久| 热99在线视频| 国产午夜精品全部视频播放| 国产精品入口免费视频一| 精品久久久久国产| 亚洲在线视频观看| 色综合久久悠悠| 2019中文字幕全在线观看| 国产精品专区h在线观看| 色偷偷噜噜噜亚洲男人的天堂| 97在线视频免费观看| 久久久国产成人精品| 在线观看欧美成人| 欧美色视频日本版| 国产日韩欧美电影在线观看| 中文国产亚洲喷潮| 九九九热精品免费视频观看网站| 中文字幕精品在线| 日韩美女福利视频| 91精品久久久久久久久久入口| 中文日韩在线观看| 欧美日韩精品国产| 69视频在线播放| 国产97在线观看| 精品欧美一区二区三区| 视频在线观看一区二区| 久久久久久免费精品| 亚洲天堂一区二区三区| 黑人精品xxx一区| 一区二区三区亚洲| 欧美一级电影在线| 国产精品第七十二页| 欧美丰满老妇厨房牲生活| 国产一区二区久久精品| 欧美乱大交做爰xxxⅹ性3| 国产精品激情av电影在线观看| 91嫩草在线视频| 亚洲国产精品一区二区三区| 亚洲精品欧美日韩专区| 欧美午夜激情在线| 精品久久久久久电影| 国产精品久久久久久久久久久久久| 中文字幕亚洲精品| 在线视频日本亚洲性| 日本精品视频网站| 国产欧美日韩中文| 亚洲自拍偷拍区| 欧美日韩亚洲视频一区| 日韩欧美在线中文字幕| 国产精品美女免费| 亚洲大胆人体av| 国产综合在线视频| 主播福利视频一区| 亚洲国产精品va在看黑人| 红桃视频成人在线观看| 一本色道久久88精品综合| 亚洲第一区在线观看| 国产91免费观看| 国产精品成人va在线观看| 美女国内精品自产拍在线播放| 亚洲国产精品成人av| 欧美在线www| 久久精品亚洲一区| 欧美日产国产成人免费图片| 青草青草久热精品视频在线观看| 国产视频精品免费播放| 中文亚洲视频在线| 亚洲色无码播放| 中文字幕av一区中文字幕天堂| 国产精品一久久香蕉国产线看观看| 精品国偷自产在线视频99| 亚洲欧美日韩爽爽影院| 国产午夜精品全部视频播放| 亚洲精品美女免费| 久久男人资源视频| 精品国偷自产在线视频| 日韩禁在线播放| 亚洲高清在线观看| 国产999在线观看| 久久久久国产精品一区| 日韩av色在线| xxxxx91麻豆| 成人有码在线播放| 国产91在线高潮白浆在线观看| 亚洲香蕉伊综合在人在线视看| 久久视频这里只有精品| 欧美日韩中文字幕日韩欧美| 国产精品电影在线观看| 欧美激情videos| 国产精品一区二区性色av| 日韩激情视频在线| 九九九热精品免费视频观看网站| 高清在线视频日韩欧美| 91手机视频在线观看| 最好看的2019的中文字幕视频| 欧美成人精品激情在线观看| 97国产成人精品视频| 亚洲成av人片在线观看香蕉| 欧美高清在线播放| 午夜精品美女自拍福到在线| 国产精品美女www| 欧美激情精品久久久久久大尺度| 精品综合久久久久久97|