- ES 5 版本的規格,在 ES 6 可以使用 Let 來解決 Closure 的問題
 
- Closure 
 
- JavaScript function 可當一個值使用,因此 function 當回傳值是很普遍
 
- JavaScript 變數的生命周期是存活在宣告 function  中,當 function 回傳值為 function  或者 object,而此 object 定義 function,這樣就形成 Closure,延長區域的變數生命周期
 
- Case 1
 
// 缺點 result 為全域變數
var result = 0;
function add (x, y) {
    result = (x + y);
    console.log(result);
};
add(10, 20);
add(20, 30);
add(30, 40);
// 使用 function 封裝,使 result 為區域變數
function closureAdd() {
    var result = 0;
    
    function add (x, y) {
        result = (x + y);
        console.log(result);
    };
    add(10, 20);
    add(20, 30);
    add(30, 40);
}
closureAdd();
 
// 當函數的回傳值為 function,會形成 "Closure"
// 延長區域變數的生命週期
function closureAdd() {
    var result = 0;
    
    function add (x, y) {
        result = (x + y);
        console.log(result);
    };
    return add;
}
var add = closureAdd();
add(10, 20);
add(20, 30);
add(30, 40);
 
function closureAdd() {
    var result = 0;
    return function (x, y) {
        result = (x + y);
        console.log(result);
    };;
}
var add = closureAdd();
add(10, 20);
add(20, 30);
add(30, 40);
 
- Immediately Invoked Functions (IIFE)
 
- 通常 function 都是被叫用後才執行 (ex: add())
 
- IIFE 定義之後,馬上就會執行 function 
 
- JavaScript 區域變數有效範圍 (Scope) 在 function 中,因變數宣告在 IIFE 中,可以避免區域變數命名與全域變數的名稱衝突問題
 
- Case 5 - Closure, Immediately Invoked Functions
 
var add = function () {
    var result = 0;
    return function (x, y) {
        result = (x + y);
        console.log(result);
    };;
}();
add(10, 20);
add(20, 30);
add(30, 40);
 
 
沒有留言:
張貼留言