搜尋
首頁web前端js教程JavaScript 的底層是如何運作的?

這篇文章的真正目的是以一種簡單的方式介紹 JavaScript 在底層如何工作,這樣即使是新程式設計師也能夠掌握這個概念並可視化編寫 JavaScript 時會發生什麼。
首先,我想專注於至少 3 個問題,這將有助於克服困難並內化背後的邏輯?
這些問題也是 Web 開發人員在面試時可能會被問到的問題,其中 JavaScript 意味著:

1。 JavaScript 是如何運作的?
2.解釋一下同步和非同步的差別?
3.或解釋這句話:JavaScript是單執行緒語言,可以是非阻塞的?

確實,編寫程式並不需要知道JavaScript 內部是如何運作的,但是為了理解背後發生的事情並感受你正在編寫的內容,學習JavaScript 是必要且至關重要的,因此對於許多擁有多年經驗的開發人員來說營運商不想知道這一點。

讓我們先知道什麼是程式? 程式只是一組指令,告訴電腦要做什麼以及如何執行任務。程式必須分配記憶體,否則,我們將無法在電腦上擁有變量,甚至無法儲存檔案。程式還應該解析(讀取)並執行專用任務,並且所有操作都發生在記憶體中。

現在,JavaScript 擁有每個瀏覽器都實作的名為 JavaScript 引擎 的引擎。例如,在 Chrome 中,它稱為 V8,在 Mozilla Firefox 中:Spider Monkey,Safari 瀏覽器:JavaScript Core Webkit。

下圖為 google chrome 的 V8 引擎
How JavaScript works underneath the hood?

JavaScript 引擎內部發生了什麼事?

JavaScript 引擎(例如 Chrome 中的 V8)讀取我們編寫的 JavaScript 程式碼,並將其轉換為瀏覽器的機器執行指令。上圖顯示了 JavaScript 引擎的各個部分,它由兩部分組成,即內存堆**和**調用堆疊

還要注意的是,記憶體分配發生在記憶體堆中,而解析(讀取)和執行發生在呼叫堆疊中。除此之外,記憶體堆告訴你你在程式中的位置。

讓我們用 JS (JavaScript) 程式碼看看記憶體堆中的記憶體分配

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

那麼,上述程式碼在全域宣告後會出現什麼問題呢?

有一種叫做記憶體洩漏的東西。如上所述,變數聲明發生在記憶體堆中,並且它的分配大小是有限的。當您繼續聲明非常大的陣列而不是數字甚至未使用的全域變數時,這會填滿記憶體並導致記憶體洩漏。你會聽到全域變數很糟糕,因為當我們忘記清理時,我們會填滿這個記憶體堆,最終瀏覽器將無法運作。

呼叫堆疊怎麼樣?

如果我們還記得的話,讀取和執行腳本的是呼叫堆疊。我們用程式碼來說明一下吧。

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

透過上面的程式碼,呼叫sack讀取第一行console.log(“x”);並被放入呼叫堆疊中,JavaScript引擎辨識出console. log已被添加,然後將其彈出到調用堆疊中,運行它,並輸出x。之後,它會刪除第一個console.log,因為它已完成運行,並將其放入第二個console.log(“y”),將其添加到呼叫堆疊中,執行y 並刪除第二個console.log。最後使用相同的過程取得console.log(“z”)。

這是最簡單的演示,如果再複雜一點怎麼辦?舉個典型的例子:


// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z
現在,根據呼叫堆疊,上面的程式碼發生了什麼事?讓我們看看它將如何運行上面的程式碼區塊:

//呼叫堆疊

函數

example1() 將首先運行,然後函數example2() 出現在調用堆疊的頂部並運行,在檢查是否存在後打印出數字7 作為輸出其他要運行的程式碼。之後,它將開始按從 console.log(‘7’)、example2()、example1() 開始的順序從呼叫堆疊中刪除,並且呼叫堆疊現在為空。

>我們還記得這句話嗎? JavaScript 是一種非阻塞的單執行緒語言。

單執行緒意味著它只有一個呼叫堆疊。它一次只能執行一件事,需要強調的是呼叫堆疊是先進後出的,就像堆疊

其他語言可以有許多呼叫堆疊,也就是所謂的

多執行緒,擁有多個呼叫堆疊可能更有利,這樣我們就不必一直等待任務。

>但是,為什麼 JavaScript 被設計為單執行緒呢?

要回答這個問題,通常在單執行緒上執行程式碼非常容易,因為多執行緒環境中不會出現複雜的場景。你實際上有一件事情需要關心。在多執行緒中,可能會出現死鎖之類的問題。有了這個理論,我們很容易知道同步程式設計意味著什麼

同步程式簡單來說就是:執行第一行程式碼,執行第二行程式碼,執行第三行程式碼,等等......

更明確地說,這意味著console.log(“y”) 無法運行,直到console.log(“x”) 完成並且console. log (“z”) 直到前兩個都完成後才開始,因為它是一個 呼叫堆疊

程式設計師很可能會使用 stackoverflow.com 網站。這個名字是什麼意思?出色地。讓我們來看看:

How JavaScript works underneath the hood?
堆疊溢位是如何發生的

上圖顯示了記憶體洩漏是如何發生的以及 JavaScript 引擎的記憶體堆如何溢出。這裡,呼叫堆疊接收許多大於其大小的輸入並溢出。

可以藉助程式碼來示範堆疊溢位:

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

請注意,JavaScript 是單執行緒的,一次只執行一個語句。 現在有一個問題:如果下面程式碼區塊中的console.log(“y”)有一個需要更長時間才能完成的大任務怎麼辦?例如循環遍歷具有數千或數百萬項的數組?那裡會發生什麼事?

// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z

第一行將執行,並假設第二行有大量工作要執行,因此第三行將等待很長時間才能執行。在上面的範例中,這沒有多大意義,但讓我們想像一個執行繁重操作的大型網站,用戶將無法執行任何操作。網站將凍結,直到任務完成並且用戶在那裡等待。對於表演來說這是一次糟糕的體驗。

嗯,對於同步任務,如果我們有一個函數需要花費很多時間,那麼它就會阻塞隊列。所以,聽起來我們需要一些非阻塞的東西。請記住我上面提到的那句話:JavaScript 是一種可以非阻塞的單執行緒語言。

理想情況下,在 JavaScript 中我們不會等待需要時間的事情。那麼,我們該如何解決這個問題呢?

作為救援,有非同步程式設計。那麼,這是什麼?

將非同步視為一種行為。同步執行很棒,因為它是可預測的。在同步中,我們知道首先發生什麼,接下來發生什麼等等,但它可能會變慢。

當我們必須執行影像處理或透過網路發出請求(例如 API 呼叫)等操作時,我們使用的不僅僅是非同步同步任務。

讓我們來看看如何用程式碼進行非同步程式設計:

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

現在,根據上面的程式碼,我們似乎跳過了第二行並執行第三行,並等待 3 秒輸出結果。這是異步發生的。

為了理解這一點以及發生了什麼,讓我們使用下圖。

How JavaScript works underneath the hood?
JavaScript 執行環境

為了運行 JavaScript,我們需要的不只是記憶體堆和呼叫堆疊。我們需要所謂的 JavaScript Run-Time,它是瀏覽器的一部分。它包含在瀏覽器中。在引擎之上,有一些稱為Web API,回調隊列事件循環,如圖所示。

現在我們來討論一下使用 setTimeout 函數的程式碼。

// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z

setTimeout 函數 是 Web API 的一部分,而不是 JavaScript 的一部分,相反,它是瀏覽器提供給我們用來進行非同步程式設計的函數。因此,讓我們提供更多詳細資訊以進行澄清。

呼叫堆疊: console.log(“x”) 進入呼叫堆疊,運行,然後我們將 console.log 傳送到瀏覽器。之後,setTimeout(() =>{console.log(“y”);},3000);進入呼叫堆疊,因為第一個任務完成,然後轉到第二個任務。

現在有件事,在閱讀程式碼時,呼叫堆疊會偵測到有一個setTimeout 函數 已被設置,它不是JavaScript 的一部分,而是Web API 的一部分(參見圖JavaScript 執行時間環境)並具有其特殊的特性。發生的情況是 setTimeout 觸發 WEB API 並且由於 Web API 收到通知,該函數將從呼叫堆疊中彈出。

現在,Web API 啟動一個三秒的計時器,知道它必須在 3 秒內完成任務。請記住這裡,因為呼叫堆疊是空的,JavaScript 引擎繼續到第 3 行,即 console.log(“z”);並執行它。這就是為什麼我們得到結果 x,z 但我們在 Web API 中設定了三秒鐘的 setTimeout。然後,三秒鐘後,當時間限制結束時,setTimeout 運行並查看其中的內容,然後就完成了。完成後,Web API 將識別出它有 setTimeout 的 callback() 函數,並將其添加到 CALLBACK QUEUE 準備運行它。

我們來到最後一部分,即**事件循環*。這個函數會一直檢查呼叫堆疊是否為空。當它為空並且JavaScript 引擎中目前沒有運行任何內容時,它將檢查回調隊列並使用console.log(“z”) 找到我們的**callback()* 函數,然後將其放入CALL STACK 並運行。完成後,將其從呼叫堆疊中彈出。現在一切都是空的並且得到結果 x z y。

結論:在這篇文章中,我們看到了很多有關幕後發生的事情的信息,以完全理解 JavaScript 邏輯以及同步和異步執行的任務。

希望這將有助於新的和高級 JavaScript 程式設計師享受在 ReactJS 或 AngularJS 等 JavaScript 相關框架中進行編碼,因為這是理解高級邏輯的基礎。

>快樂編碼

參考文獻

https://www.freecodecamp.org/news/how-javascript-works-behind-the-scenes。
https://www.simplilearn.com/tutorials/javascript-tutorial/callback-function-in-javascript#

以上是JavaScript 的底層是如何運作的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

Safe Exam Browser

Safe Exam Browser

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

SecLists

SecLists

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