在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對(duì)象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時(shí)有無 var 聲明的區(qū)別
淺談 JavaScript Array 對(duì)象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對(duì)象),Math 對(duì)象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點(diǎn)
淺談 Javascript 變量作用域問題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時(shí)間對(duì)象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對(duì)象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語言的編碼規(guī)范
淺談 JavaScript 實(shí)現(xiàn)面向?qū)ο笾械念?/span>
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運(yùn)動(dòng)的停止條件
淺談 javascript 實(shí)現(xiàn)八大排序
淺談 javascript 的分號(hào)的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測(cè)
淺談 javascript 對(duì)象模型和 function 對(duì)象
淺談 Javascript 如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計(jì)
淺談 Javascript 事件處理程序的幾種方式

淺談 javascript 回調(diào)函數(shù)

把函數(shù)作為參數(shù)傳入到另一個(gè)函數(shù)中。這個(gè)函數(shù)就是所謂的回調(diào)函數(shù)。

經(jīng)常遇到這樣一種情況,某個(gè)項(xiàng)目的 A 層和 B 層是由不同的人員協(xié)同完成。A 層負(fù)責(zé)功能 funA,B 層負(fù)責(zé) funcB。當(dāng) B 層要用到某個(gè)模塊的數(shù)據(jù),于是他對(duì) A 層人員說,我需要你們提供滿足某種需求的數(shù)據(jù), 你給我提供一個(gè)接口。

A 層的人員說: 我給你提供數(shù)據(jù),怎么展示和處理則是 B 的事情。

當(dāng)然 B 層不可能為你每個(gè)需求都提供一個(gè)數(shù)據(jù)接口,B 給 A 提供一個(gè)通過的接口。B 得到數(shù)據(jù),然后 B 寫函數(shù)去展示。

即,你需要和其他人合作,別人提供數(shù)據(jù),而你不需要關(guān)注別人獲取或者構(gòu)建數(shù)據(jù)的方式方法。你只要對(duì)這個(gè)拿到的數(shù)據(jù)進(jìn)行操作。這時(shí)候就需要使用回調(diào)函數(shù)

因此,回調(diào)本質(zhì)上是一種設(shè)計(jì)模式,并且 jQuery(包括其他框架)的設(shè)計(jì)原則遵循了這個(gè)模式。

一個(gè)同步(阻塞)中使用回調(diào)的例子,目的是在 func1 代碼執(zhí)行完成后執(zhí)行 func2。

var func1=function(callback){  

    //do something.  

    (callback && typeof(callback) === "function") && callback();  

}  
func1(func2);  

    var func2=function(){  

}  

異步回調(diào)的例子:

$(document).ready(callback);  
    $.ajax({  

        url: "test.html",  

        context: document.body  

    }).done(function() {   

        $(this).addClass("done");  

    }).fail(function() {   

        alert("error");  

    }).always(function() {   

        alert("complete");   

    });  

注意的是,ajax 請(qǐng)求確實(shí)是異步的, 不過這請(qǐng)求是由瀏覽器新開一個(gè)線程請(qǐng)求, 當(dāng)請(qǐng)求的狀態(tài)變更時(shí), 如果先前已設(shè)置回調(diào), 這異步線程就產(chǎn)生狀態(tài)變更事件放到 JavaScript 引擎的處理隊(duì)列中等待處理。見:http://www.phpv.net/html/1700.html

回調(diào)什么時(shí)候執(zhí)行

回調(diào)函數(shù),一般在同步情境下是最后執(zhí)行的,而在異步情境下有可能不執(zhí)行,因?yàn)槭录]有被觸發(fā)或者條件不滿足。

回調(diào)函數(shù)的使用場(chǎng)合

資源加載:動(dòng)態(tài)加載 js 文件后執(zhí)行回調(diào),加載 iframe 后執(zhí)行回調(diào),ajax 操作回調(diào),圖片加載完成執(zhí)行回調(diào),AJAX 等等。

DOM 事件及 Node.js 事件基于回調(diào)機(jī)制(Node.js 回調(diào)可能會(huì)出現(xiàn)多層回調(diào)嵌套的問題)。

setTimeout 的延遲時(shí)間為 0,這個(gè) hack 經(jīng)常被用到,settimeout 調(diào)用的函數(shù)其實(shí)就是一個(gè) callback 的體現(xiàn)

鏈?zhǔn)秸{(diào)用:鏈?zhǔn)秸{(diào)用的時(shí)候,在賦值器(setter) 法中(或者本身沒有返回值的方法中)很容易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,而取值器(getter)相對(duì)來說不好實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,因?yàn)槟阈枰≈灯鞣祷啬阈枰臄?shù)據(jù)而不是 this 指針,如果要實(shí)現(xiàn)鏈?zhǔn)椒椒?,可以用回調(diào)函數(shù)來實(shí)現(xiàn)。

setTimeout、setInterval 的函數(shù)調(diào)用得到其返回值。由于兩個(gè)函數(shù)都是異步的,即:他們的調(diào)用時(shí)序和程序的主流程是相對(duì)獨(dú)立的,所以沒有辦法在主體里面等待它們的返回值,它們被打開的時(shí)候程序也不會(huì)停下來等待,否則也就失去了 setTimeout 及 setInterval 的意義了,所以用 return 已經(jīng)沒有意義,只能使用 callback。callback 的意義在于將 timer 執(zhí)行的結(jié)果通知給代理函數(shù)進(jìn)行及時(shí)處理。

網(wǎng)上收集一下資料,應(yīng)該弄懂了,自己整理出一個(gè)例子:

function fun(num,callback){  

    if(num<0)  {   

        alert("調(diào)用 A 層函數(shù)處理!");  

        alert("數(shù)據(jù)不能為負(fù), 輸入錯(cuò)誤!");   

    }else if(num==0){  

        alert("調(diào)用 A 層函數(shù)處理!");  

        alert("該數(shù)據(jù)項(xiàng)不存在!");  

    }else{  

        alert("調(diào)用 B 層函數(shù)處理!");  

        callback(1);  

    }  

}  

function test(){  

    var num=document.getElementById("score").value;  

    fun(num,function(back){ // 匿名 B 層處理函數(shù)  

    alert(":"+back);  

        if(num<2)   

            alert("數(shù)字為 1");  

        else if(num<=3)   

            alert("數(shù)字為 2 或 3!");  

        else   

            alert("數(shù)字大于 3!");   

    })  

 }  

當(dāng)函數(shù)開始執(zhí)行 fun 的時(shí)候,先跑去找判定 num 是否是負(fù)數(shù)或者為零,否則執(zhí)行 B 層處理函數(shù) alert(":"+back);輸出 1,判定為 <2、<=3、>3 等情況。

經(jīng)驗(yàn)小提示:

最好保證回調(diào)存在且必須是函數(shù)引用或者函數(shù)表達(dá)式:

(callback && typeof(callback) === "function") && callback();
[js] view plaincopy
var obj={  

        init : function(callback){  

        //TODO ...  

        if(callback && typeof(callback) === "function") && callback()){  

              callback('init...');// 回調(diào)  

        }  

    }  

最后,關(guān)于為什么要使用回調(diào)函數(shù)呢?下面的比喻很生動(dòng)有趣。

你有事去隔壁寢室找同學(xué),發(fā)現(xiàn)人不在,你怎么辦呢?

方法 1,每隔幾分鐘再去趟隔壁寢室,看人在不

方法 2,拜托與他同寢室的人,看到他回來時(shí)叫一下你

前者是輪詢,后者是回調(diào)。

那你說,我直接在隔壁寢室等到同學(xué)回來可以嗎?

可以啊,只不過這樣原本你可以省下時(shí)間做其他事,現(xiàn)在必須浪費(fèi)在等待上了。把原來的非阻塞的異步調(diào)用變成了阻塞的同步調(diào)用。

JavaScript 的回調(diào)是在異步調(diào)用場(chǎng)景下使用的,使用回調(diào)性能好于輪詢。

更簡(jiǎn)單一點(diǎn):

“我現(xiàn)在出發(fā),到了通知你”

這是一個(gè)異步的流程,“我出發(fā)” 這個(gè)過程中(函數(shù)執(zhí)行),“你” 可以去做任何事,“到了”(函數(shù)執(zhí)行完畢)“通知你”(回調(diào))進(jìn)行之后的流程。