不返回求和的結果仗颈,而是返回求和的函數(shù)
function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]);
f(); // 15
每次調用都會返回一個新的函數(shù)
var f1 = lazy_sum([1, 2, 3, 4, 5]);
var f2 = lazy_sum([1, 2, 3, 4, 5]);
f1 === f2; // false
返回的函數(shù)并沒有立刻執(zhí)行浊伙,而是直到調用了f()才執(zhí)行
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
注意arr保存的是函數(shù)
f1(); // 16
f2(); // 16
f3(); // 16
返回的函數(shù)引用了變量i,但它并非立刻執(zhí)行冀续。等到3個函數(shù)都返回時钢属,它們所引用的變量i已經變成了4,因此最終結果為16车猬。
如果一定要引用循環(huán)變量怎么辦霉猛?方法是再創(chuàng)建一個函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當前的值珠闰,無論該循環(huán)變量后續(xù)如何更改惜浅,已綁定到函數(shù)參數(shù)的值不變:
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push((function (n) {
return function () {
return n * n;
}
})(i));
}
return arr;
}
var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1(); // 1
f2(); // 4
f3(); // 9
創(chuàng)建一個匿名函數(shù)并立刻執(zhí)行的語法
(function (x) {
return x * x;
})(3); // 9
由于JavaScript語法解析的問題,會報SyntaxError錯誤
(function (x) { return x * x }) (3);
(function (x) {
return x * x;
})(3);
借助閉包伏嗜,同樣可以封裝一個私有變量
'use strict';
function create_counter(initial) {
var x = initial || 0;
return {
inc: function () {
x += 1;
return x;
}
}
}
var c1 = create_counter();
c1.inc(); // 1
c1.inc(); // 2
c1.inc(); // 3
var c2 = create_counter(10);
c2.inc(); // 11
c2.inc(); // 12
c2.inc(); // 13
利用閉包創(chuàng)建新的函數(shù)pow2和pow3
function make_pow(n) {
return function (x) {
return Math.pow(x, n);
}
}
// 創(chuàng)建兩個新函數(shù):
var pow2 = make_pow(2);
var pow3 = make_pow(3);
pow2(5); // 25
pow3(7); // 343