函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
- 实现对一个Array的求和,通常如下:
function sum(arr) {
return arr.reduce(function (x, y) {
return x + y;
});
}
sum([1, 2, 3, 4, 5]); // 15
如果不需要立即求和,后面根据需求再进行计算,可以先返回求和的函数!
function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}
这时候,调用lazy_sum,返回的不是计算结果,返回的是 sum()函数。
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
返回的是 function sum();调用函数 f 时,才是真正的求和结果。
注意:当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:
var f1 = lazy_sum([1, 2, 3, 4, 5]);
var f2 = lazy_sum([1, 2, 3, 4, 5]);
f1 === f2; // false
f1 (1)和f(2)是不同的函数,调用结果互不影响。
- 闭包
返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:
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];
f1(); // 16
f2(); // 16
f3(); // 16
全部都是16!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了4,因此最终结果为16。
注意:返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。