JavaScript-執行堆

呼叫函數(Invocation)

當我們說到invocation function或是 function invocation,代表是去執行這個函式。

在JavaScript中,使用小括號()做「呼叫函式(invocation)」的動作

1
2
3
4
function a(){
//宣告、定義a函式內容
};
a();//呼叫a函式

執行堆(Execution Stack)

每一次在JavaScript呼叫函式,就會創造出一個新的執行環境,並且堆疊放進執行堆中(後者在上),這個執行環境中會有自己的記憶體空間,用以存取區域變數和函式,並獨立進行其中的區域創建與執行

1
2
3
4
5
6
7
function b(){

}
function a(){
b();
}
a();

上方的實際運作,當在全域creation創建階段時

  1. 會在全域記憶體中創建a()與b()函式

接著在全域execution執行階段時

  1. 讀到第7行時會呼叫a()函式,此時就會創造一個新的執行環境,放到執行堆中
  2. 當進入a()函式中呼叫到b()函式時,則會暫停當前的執行,另外創建一個新的執行環境,放到執行堆中
  3. 當b()函式執行完畢之後,該執行環境就會從之星堆被拿掉(pop)
  4. 接著回到a()函式中,執行完畢後,該執行環境再被拿掉(pop)
  5. 最後回到全域繼續執行完畢

變數環境

每當一個執行環境被創造時,他都會有獨立的記憶體空間,用以存取區域變數和函式。

變數環境指的是,創建變數的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
function b(){
var myVar;
console.log(myVar);//undefined
}
function a(){
var myVar = 2;
console.log(myVar);//2
b();
}
var myVar =1;
console.log(myVar);//1
a();
console.log(myVar);//1

上方的實際運作,當在全域creation創建階段時

  1. 會在全域記憶體中創建a()與b()函式,以及變數myVar初始值為undefined

接著在全域execution執行階段時

  1. 讀到第10行時,會在全域的記憶體中設定變數myVar的值為1
  2. 讀到第12行時會呼叫a()函式,此時就會創造一個新的執行環境,放到執行堆中。在其中的獨立記憶體,創建變數myVar,同樣先給預設值undefined,等到執行到第6行內容,才設定myVar的值為2
  3. 在a()函式中呼叫到b()函式時,則會暫停a()當前的執行,另外創建一個新的執行環境,放到執行堆中
  4. 在b()函式中,又再獨立的記憶體中創建變數myVar,同樣先給預設值undefined
  5. 當b()函式執行完畢之後,該執行環境就會從之星堆被拿掉(pop)
  6. 接著回到a()函式中,執行完畢後,該執行環境再被拿掉(pop)
  7. 最後回到全域繼續執行完畢
© 2020 Leah's Blog All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero