首頁 >web前端 >js教程 >JavaScript閉包其三:閉包的用法

JavaScript閉包其三:閉包的用法

黄舟
黄舟原創
2016-12-20 16:11:101196瀏覽

實際使用的時候,閉包可以創造出非常優雅的設計,允許對funarg上定義的多種計算方式進行自訂。如下就是數組排序的例子,它接受一個排序條件函數作為參數:

[1, 2, 3].sort(function (a, b) {
  ... // 排序条件
});

同樣的例子還有,數組的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方法,在函數式程式設計中也可以用作應用函數。 這裡,我們將它們看作是應用函數—— 應用到參數中的函數(在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 () {
  // 当数据就绪的时候,才会调用;
  // 这里,不论是在哪个上下文中创建
  // 此时变量“x”的值已经存在了
  alert(x); // 10
};
//...

還可以創建封裝的作用域來隱藏輔助對象:

var foo = {};
 
// 初始化
(function (object) {
 
  var x = 10;
 
  object.getX = function _getX() {
    return x;
  };
 
})(foo);
 
alert(foo.getX()); // 获得闭包 "x" – 10

總結

本文介紹了更多關於ECMAScript-262-3的理論知識,而我認為,這些基礎的理論有助於理解ECMAScript中閉包的概念。

 以上就是JavaScript閉包其三:閉包的用法的內容,更多相關內容請關注PHP中文網(www.php.cn)! 


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn