一、標准的閉包函數
//一、標准的閉包函數 function A() { var i=0; ++i; console.log('i : ' + i); return function b() { return function c() { return ++i } } } var a = A(); // 初始化A,執行A內的非function語句 ‘ i=0; ++i‘,輸出 I : 1 console.log(a()); // 執行function b,輸出 [Function: c] console.log(a()()); // 執行function b后執行 function c,輸出 2
// 將++i放入function b中 function A() { var i=0; return function b() { ++i; console.log('i : ' + i); return function c() { return ++i } } } var a = A(); // 執行i=0 沒有輸出 console.log(a()); // 執行function b,輸出 i : 1 [Function: c] console.log(a()()); // 執行function b后,再執行function c, 輸出 i : 2 3
二、箭頭函數閉包函數
//箭頭函數的閉包函數 var Add = (i = 0) => { ++i; console.log('I : ' + i); return (() => { return (() => ( ++i)) }) }; var v = Add(); // 會執行方法內的非function語句 輸出I : 1 console.log(v()()); // 第一個括號進入第一個箭頭函數,第二個括號進入第二個箭頭函數 輸出 2 console.log(v()()); // 輸出 3
//將++i放入第一個箭頭函數中 var Add = (i = 0) => { return (() => { ++i; console.log('I : ' + i); return (() => ( ++i)) }) }; var v = Add(); //會執行方法內除箭頭函數的代碼,初始化i=0 console.log(v()); //第一個括號進入第一個箭頭函數,++i執行一次,所以執行完成i的值為1 輸出 I : 1 [Function] console.log(v()()); //兩個箭頭函數都會執行,++i執行兩次,所以執行完成i的值為3 輸出:I : 2 3