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)的模擬,以及名稱空間的管理等,這之後還會再看到說明。 |