与C++不同的是,JavaScript中的函数,既可以在参数中,接收其他的函数,又可以讲函数作为返回值。当我们并不需要立刻得到一个函数的计算结果,而是根据实际需要,把函数作为返回值传递出去。
function lazy_sum(arr) {
var sum = function() {
return arr.reduce(function(x, y) {
return x+y;
});
}
return sum;
}
当我们调用函数lazy_sum时,函数返回值不是一个数组的求和计算结果,而是一个求和函数
var f = lazy_sum([1,2,3,4,5]);
f();
只有当f调用时才会计算求和的结果
不难发现,在lazy_sum中定义的sum函数的参数,其实来自函数外的参数
那么…
JavaScript为什么需要闭包呢?
在C++中,我们为了实现类中的封装,使用了private修饰了一个成员变量,类中的成员可以使用private变量,而外部调用的类的变量则无法使用,但是JavaScript是没有class这个概念的
在只有函数的语言里,借助闭包,我们依然可以封装一个私有变量
'use strict';
function create_counter(initial) {
var x = initial || 0;
return {
inc: function () {
x += 1;
return x;
}
}
}
c_c函数中实现了闭包,闭包中包含c_c的局部变量x,在外部无法调用到x,只能调用inc()