javascript
slf4j 如何返回堆栈_重学JS系列 - JS 调用堆栈
什么是 JavaScript 調(diào)用棧,為什么它是必要的?
JavaScript 引擎是一個(gè)單線程解析器,而單線程解析器由堆和單一調(diào)用棧組成。瀏覽器提供 Web APIs,比如:DOM,AJAX 和 定時(shí)器。
本文旨在說(shuō)明什么是調(diào)用堆棧以及為什么需要調(diào)用棧?對(duì)調(diào)用棧的理解有助于我們更加清晰的知道 函數(shù)的的層次結(jié)構(gòu)和執(zhí)行順序 在 JavaScript 的引擎中工作方式。
調(diào)用堆棧主要用于函數(shù)調(diào)用,由于 調(diào)用堆棧是單個(gè)的,因此函數(shù)的執(zhí)行從上到下一次性完成。這意味著調(diào)用棧是同步的。
對(duì)調(diào)用棧的理解對(duì)于異步編程至關(guān)重要,后面我們會(huì)介紹。
在異步 JavaScript 中,我們有一個(gè)回調(diào)函數(shù),一個(gè)事件循環(huán)隊(duì)列和一個(gè)任務(wù)執(zhí)行隊(duì)列。在事件循環(huán)將回調(diào)函數(shù) 推到堆棧之后,回調(diào)函數(shù)將在執(zhí)行期間由調(diào)用堆棧執(zhí)行。
在此之前,讓我們嘗試著回答什么是調(diào)用張?
在最基本的級(jí)別上,調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),它使用后進(jìn)先出(LIFO)原理臨時(shí)存儲(chǔ) 和管理函數(shù)調(diào)用。
讓我們打破之前的定義:
LIFO:當(dāng)我們說(shuō)調(diào)用堆棧是按照后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)原理進(jìn)行操作時(shí),這意味著當(dāng)函數(shù)返回時(shí),被壓入堆棧的最后一個(gè)函數(shù)是第一個(gè)彈出的函數(shù)。
讓我們通過(guò)堆棧跟蹤錯(cuò)誤打印到控制臺(tái)來(lái)掩飾 LIFO 的代碼示例:
function firstFunction(){throw new Error('Stack Trace Error'); }function secondFunction(){firstFunction(); }function thirdFunction(){secondFunction(); }thirdFunction();在瀏覽器控制臺(tái)運(yùn)行代碼,我們會(huì)打印出此下錯(cuò)誤信息,會(huì)打印出一個(gè)堆棧跟蹤,說(shuō)明如何將功能堆疊在一起,看一下該圖:
你會(huì)注意到,函數(shù)作為堆棧的排序開(kāi)始于 firstFunction() 這是進(jìn)入堆棧的最后一個(gè)函數(shù),并且以?huà)伋鲥e(cuò)誤彈出,然后就是 secondFunction(),然后就是 thirdFunction() 這是第一個(gè)函數(shù)在執(zhí)行代碼的時(shí)候?qū)⑵鋲喝攵褩!?/p>
臨時(shí)存儲(chǔ)
調(diào)用一個(gè)函數(shù)時(shí),該函數(shù),其參數(shù)和變量將被推入調(diào)用堆棧以形成堆棧框架,該堆棧是堆棧中的內(nèi)存位置。當(dāng)函數(shù)返回時(shí)(從棧彈出),將清除內(nèi)存。
管理功能調(diào)用
調(diào)用堆棧回鶻每一個(gè)堆棧幀位置的記錄。它知道下一個(gè)要執(zhí)行的功能,并在執(zhí)行后將其刪除,這就是使得 JavaScript 中的代碼執(zhí)行順序同步的原因。
調(diào)用堆棧如何處理函數(shù)調(diào)用?
我們將通過(guò)查看調(diào)用另一個(gè)函數(shù)的函數(shù)的示例代碼來(lái)回答這個(gè)問(wèn)題:
function firstFunction(){console.log("Hello from firstFunction"); }function secondFunction(){firstFunction();console.log("The end from secondFunction"); }secondFunction();這是運(yùn)行代碼時(shí)發(fā)生的情況:
是什么導(dǎo)致堆棧溢出?
當(dāng)存在沒(méi)有出口點(diǎn)的遞歸函數(shù)(調(diào)用自身的函數(shù))時(shí),將發(fā)生堆棧溢出。
看一個(gè)例子:
function callMyself() {callMyself() }callMyself()在瀏覽器執(zhí)行之后,會(huì)爆出以下錯(cuò)誤:
綜上所訴
調(diào)用堆棧的主要收獲是:
總結(jié)
以上是生活随笔為你收集整理的slf4j 如何返回堆栈_重学JS系列 - JS 调用堆栈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pythonmysql数据分析 tabl
- 下一篇: xmlstreamexception 参