在 JavaScript 中,當一個函數被調用時,會創建一個執行上下文(execution context),該上下文中包含函數的作用域(scope),並將其推入執行上下文棧(Execution Context Stack)中進行管理。當函數執行完畢時,其對應的執行上下文會被彈出執行上下文棧,該函數的作用域也會隨之銷燬。
在函數內部,如果存在使用 var
聲明的變量,其會被添加到該函數的作用域中,並在函數執行完成後銷燬。而對於使用 let
或 const
聲明的變量,其會形成暫時性死區(Temporal Dead Zone,簡稱 TDZ),在變量聲明前進行訪問操作則會報錯。其原因是變量雖然已經在作用域內聲明,但是由於作用域尚處於 TDZ 中,無法訪問該變量。
這種情況在前端開發中非常常見,特別是在使用 const 和 let 時,需要注意變量聲明的位置。具體地,在使用 let、const 聲明變量時,如果需要在當前作用域範圍內引用變量,則需要確保變量在引用前已經聲明,否則會導致代碼出錯。例如:
function test() {
console.log(typeof x); // Uncaught ReferenceError: Cannot access 'x' before initialization
let x;
}
test();
上述代碼中,由於變量 x 被聲明爲 let,形成了 TDZ,因此在 x 被聲明後才能進行訪問操作。對 x 變量進行訪問操作時,將拋出 Uncaught ReferenceError: Cannot access 'x' before initialization
錯誤。