Hoisting 這個觀念第一次聽到的時候,真是有聽沒有懂,直到再次面試前,才再次梳理這個觀念:
首先我們要先知道,Javascript 執行環境的三個階段:
創建期 (Creation Phase):
這個時期,JS 引擎會先掃描整個程式碼,為當前執行環境建立所需的記憶體空間。
簡單來說,就是在程式正式執行前,先找出所有的變數與函式宣告,並在記憶體中「預先登記」它們,就像閱讀一本書前先瀏覽目錄一樣。
執行期 (Execution Phase):
這個階段,JS 引擎會正式從上到下逐行執行程式碼。
銷毀期 (Garbage Collection):
當程式執行完畢,或變數不再被使用時,JS 會自動回收不再需要的記憶體空間。
換句話說,只要一個變數或物件沒有被任何地方引用,引擎就會把它從記憶體中清除,釋放空間給其他程式使用。這個過程是自動進行的,不需要手動釋放記憶體。
知道這些觀念後,我們來看範例,跟著以上觀念一步步釐清:
var 的 Hoisting
console.log(a);
var a = 10;
console.log(a);
a. 創建期:JS 先掃描程式碼,發現 var a。為 a 配置記憶體,並自動初始化為 undefined。
b. 執行期:
let 和 const 的 Hoisting
console.log(b);
let b = 20;
a. 創建期:JS 先掃描程式碼,發現 let b。為 b 配置記憶體,但不初始化值,變數處於暫時性死區 (TDZ)。
b. 執行期:
console.log(c);
const c = 30;
a. 創建期:JS 先掃描程式碼,發現 const c。為 c 配置記憶體,但不初始化值,變數處於暫時性死區 (TDZ)。
b. 執行期: