在了解什麼是 JavaScript 執行上下文之前,我們需要知道如何以及在哪些環境中執行 JavaScript 程式碼。
首先,我們可以在兩種環境下執行JavaScript:
- 透過瀏覽器
- 透過 Node.js
JavaScript 程式碼如何在我們的電腦上運作?
當我們在電腦上編寫 JavaScript 程式碼然後嘗試執行它時,程式碼首先會轉到瀏覽器或 Node.js。
但是,我們寫的 JavaScript 程式碼並不能被瀏覽器或 Node.js 直接理解。此時,兩者都將程式碼傳送到內建的 JavaScript 引擎。有不同類型的引擎,例如:
- Google Chrome 中的 V8 引擎,
- Mozilla Firefox 中的SpiderMonkey,
- Node.js 中的 V8 引擎等
接下來,JavaScript 引擎將 JavaScript 程式碼編譯為機器碼。然後,該機器代碼被傳送到計算機,計算機執行它,我們會看到顯示的輸出。
身為程式設計師,我們需要很好地理解這個中間步驟,即 JavaScript 引擎如何將 JavaScript 程式碼編譯為機器碼。
所以,現在我們需要了解 JavaScript 引擎是如何運作的。 JavaScript 引擎以兩種方式將程式碼轉換為機器碼。第一個是解釋,第二個是編譯。那麼,什麼是解釋和編譯呢?
什麼是口譯,它是如何運作的?
解釋是逐行讀取所有用高階語言編寫的原始程式碼,並在讀取後立即將每一行轉換為機器碼的過程。如果在讀取一行程式碼時出現錯誤,則該過程會立即停止,使程式設計師可以輕鬆識別錯誤。這使得調試變得簡單。不過,由於這個過程是逐行讀取程式碼,所以速度相對較慢。
什麼是編譯,它是如何運作的?
編譯是將所有用高階語言寫的原始碼一次轉換為機器碼的過程。在這種情況下,即使程式碼中有錯誤,它仍然會編譯並且只在執行時顯示錯誤。結果,程式設計師更難識別錯誤,從而使偵錯變得更具挑戰性。然而,由於整個原始碼立即轉換為機器碼,因此這個過程相對更快。那麼現在問題來了:JavaScript 是編譯語言還是解譯型語言?
JavaScript 是編譯型語言還是解釋型語言?
最初,JavaScript 主要被認為是一種解釋性語言。然而,由於這個過程非常緩慢,現代 JavaScript 引擎開始使用一種結合解釋和編譯的新技術,稱為即時 (JIT) 編譯。這個過程結合了解釋和編譯,將程式碼轉換為機器碼。因此,與舊方法相比,它的調試速度更快、更容易。
要了解 JavaScript 的即時 (JIT) 編譯如何運作,我們需要了解 JavaScript 的執行上下文。現在讓我們試著了解 JavaScript 的執行上下文。
JavaScript 執行上下文
首先,看一下下面的程式碼範例。
程式碼範例
var a = 1; function one() { console.log(a); function two() { console.log(b); var b = 2; function three(c) { console.log(a + b + c); } three(4); } two(); } one();
輸出
1 undefined 7
當我們執行程式碼時,我們嘗試在two()函數內宣告b變數之前列印它,但輸出是未定義的。然而,沒有發生錯誤。問題出現了:b 變數的值是如何未定義的?答案就在 JavaScript 執行上下文。現在,我們將更詳細地探討 JavaScript 執行上下文。
JavaScript 中有兩種類型的執行上下文:
- 全域執行上下文
- 函數執行上下文
每個執行上下文都會經歷兩個階段:建立階段和執行階段。
全域執行上下文
當我們執行 JavaScript 程式碼時,首先發生的是全域執行上下文。這個上下文首先經歷它的創建階段,其中發生了幾件事:
創建階段
- 建立了一個全域物件。
- 建立此物件並為其指派全域物件的值。
- 創建了一個變數對象,其中聲明了所有函數和變數。變數被指派為未定義的值,函數被指派對其各自函數的參考。
建立階段完成後,全域執行上下文將進入下一個階段:執行階段,其中會發生更多步驟。
執行階段
- 在建立階段宣告並使用 undefined 初始化的變數現在被指派了各自的值。
- 在建立階段聲明的函數(儲存為引用)現在被呼叫並執行。
函數執行上下文
當全域執行上下文的執行階段所引用的函數被呼叫時,每個函數都會建立自己的函數執行上下文。就像全域執行上下文一樣,函數執行上下文也經歷創建階段,其中發生幾個步驟:
創建階段
- 為函數建立參數物件。
- 建立此物件並為其指派全域物件的值。
- 創建了一個變數對象,其中聲明了所有函數和變數。變數被指派為未定義的值,函數被指派對其各自函數的參考。
建立階段完成後,函數執行上下文將進入執行階段,其中會發生更多步驟。
執行階段
- 在創建階段聲明的變量,之前用 undefined 初始化,現在被分配了各自的值。
- 在建立階段宣告的函數現在被呼叫並執行。
巢狀函數中的函數執行上下文
當在其他函數中呼叫函數時,將為每個函數建立一個新的函數執行上下文。然後,每個函數執行上下文都會經歷創建階段和執行階段。對於在另一個函數內調用的每個函數,此過程都會繼續,並且每個函數將分別經歷這些階段。
我們看下圖。
我們已經看到全域執行上下文和函數執行上下文都會經歷一定的步驟。唯一的區別是,在全域執行上下文中,第一步是建立全域對象,而在函數執行上下文中,第一步是為函數建立參數對象。
現在,問題出現了:當為全域上下文和每個函數建立這些執行上下文時,JavaScript 如何管理這些執行上下文?
使用執行堆疊管理執行上下文
為了管理這些上下文,JavaScript 使用一種稱為執行堆疊的資料結構。執行堆疊以類似堆疊的方式儲存上下文:首先是全域執行上下文,然後是每個函數執行上下文。當所有執行上下文都儲存在堆疊中時,JavaScript 從堆疊頂部開始一一處理它們。
使用 let 和 const 來確定作用域
要注意的是,當我們在全域或函數作用域內使用 let 或 const 宣告變數時,這些變數在建立階段不會儲存在變數物件中,也不會使用 undefined 進行初始化。相反,這些變數是在執行階段直接聲明並賦值的。
考慮以下程式碼範例:
程式碼範例
var a = 1; function one() { console.log(a); function two() { console.log(b); var b = 2; function three(c) { console.log(a + b + c); } three(4); } two(); } one();
如果我們運行這段程式碼,我們將會遇到一個ReferenceError。這是因為我們試圖在宣告 b 變數之前列印它的值,並且由於 b 是使用 const 宣告的,因此它的行為與常規變數不同。使用 const 或 let 宣告的變數在建立階段不會儲存在變數物件中,這就是為什麼在為它們賦值之前嘗試存取它們時會出現錯誤。
結論
我希望對 JavaScript 如何運作以及其執行上下文階段發生的情況的解釋能讓您有更清晰的理解。在下一課中,我們將探討另一個 JavaScript 主題。
您可以在 GitHub 和 Linkedin 上與我聯絡。
以上是JavaScript 執行上下文 – JS 程式碼如何在幕後運行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。