我們經(jīng)常會這樣使用函數(shù)回調(diào):
? 事件觸發(fā)通知
? 資源加載通知
? 定時器延時
? ajax、動畫通知等等。
以上都是很單一的事件監(jiān)聽回調(diào)的處理方式,但是jQuery把回調(diào)函數(shù)的用法設計成一個更高的抽像,用于解耦與分離變化。
如何理解這個設計?我們看下面的例子。
例子一:
jQuery針對Dom的處理提供了append、prepend、before、after等方法的處理,這幾個方法的特征:
1、參數(shù)的傳遞可以是HTML字符串、DOM元素、元素數(shù)組或者jQuery對象
2、為了優(yōu)化性能針對節(jié)點的處理需要生成文檔碎片
可見幾個方法都是需要實現(xiàn)這2個特性的,那么我們應該如何處理?
高層接口:
before: function() { return this.domManip(arguments, function(elem) { if (this.parentNode) { this.parentNode.insertBefore(elem, this); } }); }, after: function() { return this.domManip(arguments, function(elem) { if (this.parentNode) { this.parentNode.insertBefore(elem, this.nextSibling); } }); },
底層實現(xiàn):
domManip: function(args, callback) { // Flatten any nested arrays args = concat.apply([], args); // We can't cloneNode fragments that contain checked, in WebKit if (isFunction || //多參數(shù)處理 self.domManip(args, callback); } if (l) { //生成文檔碎片 fragment = jQuery.buildFragment(args, this[0].ownerDocument, false, this); callback.call(this[i], node, i); } return this; }
我們觀察下jQuery的實現(xiàn),通過抽象出一個domManip方法,然后在這個方法中處理共性,合并多個參數(shù)的處理與生成文檔碎片的處理,然后最終把結(jié)果通過回調(diào)函數(shù)返回給每一個調(diào)用者。
例子二:
在很多時候需要控制一系列的函數(shù)順序執(zhí)行。那么一般就需要一個隊列函數(shù)來處理這個問題。
我們看一段代碼:
function Aaron(List, callback) { setTimeout(function() { var task; if (task = List.shift()) { task(); //執(zhí)行函數(shù) } if (List.length > 0) { //遞歸分解 arguments.callee(List) } else { callback() } }, 25) } //調(diào)用 ?Aaron([ function() { alert('a') }, function() { alert('b') }, function() { alert('c') } ], function() { alert('callback') }) // 分別彈出 ‘a’ , ‘b’ ,'c',’callback
傳入一組函數(shù)參數(shù),靠遞歸解析,分個執(zhí)行,其實就是靠setTimeout可以把函數(shù)加入到隊列末尾才執(zhí)行的原理,這樣的寫法就有點就事論事了,聚合對象完全是一個整體,無法再次細分出來,所以我們需要一種方案,用來管理分離每一個獨立的對象。
我們換成jQuery提供的方式:
var callbacks = $.Callbacks(); callbacks.add(function() { alert('a'); }) callbacks.add(function() { alert('b'); }) callbacks.fire(); //輸出結(jié)果: 'a' 'b'
是不是便捷很多了,代碼又很清晰,所以Callbacks它是一個多用途的回調(diào)函數(shù)列表對象,提供了一種強大的方法來管理回調(diào)函數(shù)隊列。
那么我們使用回調(diào)函數(shù),總的來說弱化耦合,讓調(diào)用者與被調(diào)用者分開,調(diào)用者不關(guān)心誰是被調(diào)用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件的被調(diào)用函數(shù)。
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報