リファレンス:クロージャの実用的な使い方
実際には、クロージャはエレガントなデザインを作成し、さまざまな計算、遅延呼び出し、コールバックのカスタマイズ、カプセル化されたスコープの作成などを可能にします。
引数として並べ替え条件関数を受け入れる配列の並べ替えメソッドの例:
[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