JavaScript 語言核心(12)Closure 與一級函式
|
JavaScript 語言核心(11)this 是什麼? << 前情 Closure 是擁有閒置變數(Free variable)的運算式。閒置變數真正扮演的角色依當時環境而定。支援 Closure 的程式語言通常具有一級函式(First-class function)。建立函式不等於建立 Closure 。如果函式的閒置變數與當時環境綁定,該函式才稱為 Closure。 那麼何為閒置變數?閒置變數是指對於被建立的函式而言,既非區域變數也非參數的變數。舉個例子來說: function doSome() {
var x = 10;
function f(y) {
return x + y;
}
return f;
}
var foo = doSome();
console.log(foo(20)); // 30
console.log(foo(30)); // 40
上面的函式 function f(y) {
return x + y;
}
看來起變數 由於 如果沒有捕捉任何變數,那麼就是單純的(一級)函式而已。例如,在下面的例子中,函式 function doSome() {
var x = 10;
function f(y) {
return y + 10;
}
return f;
}
注意! Closure 關閉的是變數,而不是變數所參考的值。下面這個範例可以證明: function doSome() {
var x = 10;
function f(y) {
x = x + y;
return x;
}
return f;
}
var foo = doSome();
console.log(foo(20)); // 30
console.log(foo(30)); // 60
建立函式 由於 Closure 綁定的是變數,你才可以在 Closure 中改變了被綁定變數的值,以下是另一個例子: var sum = 0;
[1, 2, 3, 4, 5].forEach(function(elem) {
sum += elem;
});
console.log(sum); // 15
你在 Closure 中改變了 你可能會有疑問的是,如果 Closure 關閉了某個變數,使得該變數的生命週期得以延長,那麼這個會怎麼樣? function doSome() {
var x = 10;
function f(y) {
x = x + y;
return x;
}
return f;
}
var foo1 = doSome();
var foo2 = doSome();
console.log(foo1(20)); // 30
console.log(foo2(20)); // 30
在這個範例中, Closure 的應用很多,在 JavaScript 中常見用於物件私用(private)的模擬,以及名稱空間的管理等,這之後還會再看到說明。 |

Java 學習之路




