参考:闭包的实际用法
在实践中,闭包可以创建优雅的设计,允许自定义各种计算,延迟调用,回调,创建封装范围等。
数组的sort方法的一个示例,它接受sort-condition函数作为参数:
[1, 2, 3].sort(function (a, b) {
... // sort conditions
});
映射函数作为数组的映射方法,该函数根据功能参数的条件映射新数组:
[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
一个函数将应用于参数(在应用中应用于参数列表,在调用中应用于定位参数):
(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