JS的執行上下文

2022-09-10 17:45:12 字數 1931 閱讀 7475

在學習js的資料結構與演算法的時候,學到二叉搜尋樹的先序遍歷**時,看得一臉懵逼,彈幕說這是棧什麼的,根本不知道什麼意思,為什麼函式自己就往回走了

//

4、先序遍歷

binaryserachtree.prototype.preordertr**ersal = function

() binaryserachtree.prototype.preordertr**ersalnode = function

(node)

}

標橙是我懵逼的兩段**。按我的理解,當走到樹最左端最小值的時候,由於node.left是空所以傳值應該是null,函式自動停止才對。

如果沒有右走**,上面的邏輯確實沒錯。但是新增了右走**,函式就會自己往回走,我很納悶這是為什麼?

首先要理解什麼是執行上下文(execution context)?

當 j**ascript **在執行的時候, 它所在的執行環境通常認為是以下其中之一:

有且只能有1個全域性上下文, 並且可以被程式中其他的上下文訪問到。

可以有很多個函式上下文, 每個函式呼叫都創造乙個新的上下文, 並建立出乙個區域性作用域,任何在作用域內部宣告的東西都不能被當前函式作用域外部訪問到。(閉包)

執行上下文棧(execution context stack)

在瀏覽器中的 j**ascript 直譯器是單執行緒的。這實際上意味著,在瀏覽器中一次只會發生一件事,其他行為或者事件在所謂的執行棧中排隊等待。

瀏覽器第一次載入指令碼, 它將預設進入全域性執行上下文中。

如果在全域性環境中呼叫了乙個函式, 你的程式序列流會進入被呼叫的函式的當中,建立乙個新的 執行上下文 並且將這個上下文壓入執行棧之中。

如果你在當前函式裡面又呼叫了另外乙個函式, 也會發生同樣的事情:

**的執行流進入內部函式,這將建立乙個新的執行上下文,它被壓入現有棧的頂部。瀏覽器永遠會執行當前棧中頂部的執行上下文 一旦函式在當前執行上下文執行完畢,它會被從棧的頂部彈出,然後將控制權移交給當前棧的下乙個上下文當中。

這段**呼叫自己自身3次, 每次將 i 的值增加 1。

每次函式 foo 被呼叫的時候, 就會建立乙個新的執行上下文。

一旦上下文執行完畢之後, 它就會從棧中彈出並且返回控制權到下乙個上下文當中,直到全域性上下文又再次被訪問。

所以:以先序遍歷來說,其執行過程也如此

//

4、先序遍歷

binaryserachtree.prototype.preordertr**ersal = function

() binaryserachtree.prototype.preordertr**ersalnode = function

(node)

}

最主要的一點,就是從之前中斷的地方往下走,不會死迴圈

再舉乙個例子,二叉樹的搜尋,其實也和插入差不多

binaryserachtree.prototype.search = function

(key)

//內部呼叫遞迴搜尋

//單純的return true和false是只會退出當前的上下文,並不會直接退到global

binaryserachtree.prototype.searchnode = function

(node, newnode)

else

if (newnode.key

else

if (newnode.key >node.key)

} else

}

js執行上下文與執行上下文棧

在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...

JS執行上下文

執行上下文,即context,也不知道是誰翻譯的,不少的文獻 書籍用的都是這個詞。還記得第一次接觸這個詞時的惆悵 迷惘 不知所措,扶了扶眼鏡,翻開大辭典,還是翻譯成環境比較接地氣。js執行上下文,即js的執行環境。當我們的 執行時,會進入到不同的執行上下文,即不同的環境。在不同的環境中,有著不同的 ...

JS的執行上下文

執行上下文時是 執行時的環境,js 在執行前進行編譯,那麼會生成兩部分,一部分是可執行的 而另一部分則是執行上下文。用於跟蹤 執行的運 況。執行步驟如下 全域性執行上下文 函式執行上下文和 eval 執行上下文 執行上下文所包含的內容是在不斷的變化的。它主要分為了三個不同的階段。分別是es3階段,e...