------------恢复内容开始------------
闭包:
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
我们来实现一个对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; }
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15
请再注意一点,当我们调用lazy_sum()
时,每次调用都会返回一个新的函数,即使传入相同的参数
var f1 = lazy_sum([1, 2, 3, 4, 5]); var f2 = lazy_sum([1, 2, 3, 4, 5]); f1 === f2; // false
f1()
和f2()
的调用结果互不影响。
闭包
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] console.log(f1()); console.log(f2()); console.log(f3());
x => x * x 上面的箭头函数相当于: function (x) { return x * x; }
.....
generator
....