第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

章節(jié)
問答
課簽
筆記
評論
占位
占位

回調(diào)的靈活運用

我們經(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ù)過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優(yōu)惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關(guān)注公眾號
關(guān)注后,及時獲悉本課程動態(tài)

舉報

0/150
提交
取消
全部 精華 我要發(fā)布
全部 我要發(fā)布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費2個積分

繼續(xù)發(fā)表請點擊 "確定"

為什么扣積分?