1. 程式人生 > >理解js運行時的一些概念

理解js運行時的一些概念

如果 下一個 就會 內容 一個 每一個 div 連續 頂部

幀:一個幀是一個連續的工作單元。當一個js函數被調用時,運行時環境就會在棧中創建一個幀。幀裏保存了特殊的函數參數和局部變量。當函數返回時,幀就被從棧中推出。例如:

function foo(b) {
    var a = 10;
    return a + b + 6;
}
function bar(x) {
    var c = 4;
    return foo(c * x);
}

在聲明了foo和bar函數後,執行bar函數

bar(20)

當bar被執行時,運行時將會創建一個包含bar 的參數和所有局部變量的幀。這個幀被添加到了棧的頂部。

bar函數在內部調用了foo的函數,當foo函數被調用時,棧的頂部就又創建了一個新的幀。當foo函數執行完畢後,棧頂部對應的幀就被移除。當bar函數執行完畢後,相應的幀同樣被移除。

如果foo函數中又調用了bar函數,那麽就創建了一個無限循環的函數調用,就會導致棧被填滿最後拋出錯誤。

棧:棧包含了一個信息在執行時的所有步驟(幀)。棧的數據結構為“後進先出”,因此當一個幀被加入到一個棧中時,它總是被添加到最上面,事件循環會從上至下地處理棧中的幀。

隊列:

隊列中包含一個待執行信息的列表,每一個信息都與一個函數相互聯系。當棧為空時,隊列中的一條信息就會被取出並處理。處理過程為調用該信息所關聯的函數,然後將此幀添加到棧的頂部。當棧在此為空時,本次信息處理視為結束。

堆:

堆是一個內存存儲空間,它不關註內部儲存的內容的保存順序,堆中保存了所有正在被使用的變量和對象。同時也保存了一些當前作用域已經不會再被用的但還沒被垃圾回收機制回收的幀。

事件循環:

事件循環內的信息是線性執行的,這意味著它接收到一個信息後,在處理完畢之前,不會再處理其他任何信息。如果棧是空的,那麽函數就會立刻執行。當所有的幀被加入棧中後,棧便開始從上至下清除這些幀。最後,棧會被清空,然後下一個信息將會被處理。

理解js運行時的一些概念