請說明什麼是 Hosting 提升?
Hosting 提升指的是在執行 JavaScript 程式碼之前, JavaScript 引擎會將變數和函式的宣告提升到作用域的頂端。
當瀏覽器運行 Javascript 引擎的時候也就是 runtime 時,會進入創造階段:
創造階段
首先進入創造階段,JavaScript 引擎會會將幫所有的變數和函式準備記憶體的空間,此時的變數與函式會提升。
var 變數的提升
var 變數的宣告會被提升到作用域的的頂端,但賦值(值的初始化)不會被提升。因此,在提升後變數會被初始化為 undefined。
var counts = 2;
當提升時可以理解成以下:
var counts; //提升到函式作用域的的頂端,這時候的 counts 值是 undefined
counts = 2; //此時賦值 2
const 變數和 let 變數的提升
let 和 const 宣告也會被提升,但與 var 不同的是,它們不會被初始化為 undefined,而是會進入「暫時死區」(TDZ, Temporal Dead Zone),直到程式執行到宣告它們的那一行為止。如果在此之前訪問它們,會拋出 ReferenceError。
let counts = 3;
const times = 5;
當提升時可以理解成以下:
counts; // ReferenceError 因為尚未被宣告
times; // ReferenceError 因為尚未被宣告
let counts = 3; //宣告並且賦值
const times = 5; //宣告並且賦值