作用域(Scope) 和 **閉包(Closures)**對編寫高效、可維護的 JavaScript 代碼至關重要。
作用域 是指在代碼中變量和函數的可訪問範圍。JavaScript 中的作用域主要分為以下兩種:
範例:
let globalVar = "全局變量";
function testScope() {
let localVar = "局部變量";
console.log(globalVar); // 可以訪問全局變量
console.log(localVar); // 可以訪問局部變量
}
testScope();
console.log(localVar); // 錯誤:無法訪問局部變量
在這個例子中,globalVar 是全局變量,能在任何地方訪問;而 localVar 是函數內的局部變量,僅在函數內可用。
區塊作用域 是在 ES6 中引入的,通過 let 和 const 來定義。區塊作用域指的是變量只能在其定義的區塊內可見(例如 if、for 等代碼塊)。
範例:
if (true) {
let blockVar = "區塊變量";
console.log(blockVar); // 可以訪問區塊變量
}
console.log(blockVar); // 錯誤:無法訪問區塊變量
在這個例子中,blockVar 只能在 if 區塊內訪問,出了該區塊則無法訪問。
閉包 是指函數可以「記住」並訪問它的詞法作用域,即使該函數在其作用域之外執行。當一個內部函數被返回或傳遞出去後,依然能夠記住它被創建時的作用域。
範例:
function outer() {
let outerVar = "我是外部變量";
function inner() {
console.log(outerVar); // 可以訪問外部變量
}
return inner;
}
let innerFunction = outer();
innerFunction(); // 輸出 "我是外部變量"
在這個例子中,inner 函數被返回並賦值給 innerFunction,即使 outer 函數已經執行完畢,但 innerFunction 仍然能夠訪問 outerVar,這就是閉包的概念。
閉包經常用於保持狀態和創建私有變量。例如,我們可以使用閉包來實現計數器功能:
範例:
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
let counter = createCounter();
console.log(counter()); // 輸出 1
console.log(counter()); // 輸出 2
console.log(counter()); // 輸出 3
在這個例子中,createCounter 返回了一個函數,該函數能夠訪問 count 變量,並且每次調用時 count 的值都會自增。這樣,閉包就能「記住」之前的狀態。