参考:闭包的实际使用
在实践中,闭包可以创建优雅的设计,允许自定义各种计算、延迟调用、回调、创建封装的作用域等。
一个例子是数组的sort方法,它接受sort条件函数作为参数:
[1, 2, 3].sort(function (a, b) {
... // Sort conditions
});
将函数函数映射为数组的map方法,它根据函数参数的条件映射一个新数组:
[1, 2, 3].map(function (element) {
return element * 2;
}); // [2, 4, 6]
通常,通过使用函数参数定义几乎无限的搜索条件来实现搜索函数是很方便的:
someCollection.find(function (element) {
return element.someProperty == 'searchCondition';
});
此外,我们可能会注意到应用函数,例如,forEach方法将函数应用于元素数组:
[1, 2, 3].forEach(function (element) {
if (element % 2 != 0) {
alert(element);
}
}); // 1, 3
函数应用于实参(在apply中应用于实参列表,在call中应用于定位实参):
(function () {
alert([].join.call(arguments, ';')); // 1;2;3
}).apply(this, [1, 2, 3]);
延迟调用:
var a = 10;
setTimeout(function () {
alert(a); // 10, after one second
}, 1000);
回调函数:
var x = 10;
// Only for example
xmlHttpRequestObject.onreadystatechange = function () {
// Callback, which will be called deferral ,
// when data will be ready;
// variable "x" here is available,
// regardless that context in which,
// it was created already finished
alert(x); // 10
};
创建一个用于隐藏辅助对象的封装作用域:
var foo = {};
(function (object) {
var x = 10;
object.getX = function _getX() {
return x;
};
})(foo);
alert(foo.getX()); // Get closured "x" – 10