javascript callback函数的理解与使用

简介: 最近做的一个项目中用到了callback函数,于是就研究了下总结下我对javascript callback的理解 首先从callback的字面翻译“回调” 可以理解这是一个函数被调用的机制 当我们遇到一个名词首先可能是百度谷歌搜索看官方是怎么解释的下面是维基百科对回调的定义: a callba...

最近做的一个项目中用到了callback函数,于是就研究了下总结下我对javascript callback的理解 首先从callback的字面翻译“回调” 可以理解这是一个函数被调用的机制

当我们遇到一个名词首先可能是百度谷歌搜索看官方是怎么解释的
下面是维基百科对回调的定义:

a callback is a piece of executable code that is passed as an argument to other code which is expected to call back (execute) the argument at some convenient time
硬翻译:一个回调函数是作为另一个函数的参数的一个可执行的代码段 这个代码段在方便的时间来执行
通俗形象的解释:把函数f2当做一个参数传给函数f1 并且在f1里适当的时间执行f2(下面的所有例子我都用f1,f2表示)

所以我们可以得到一个这样的回调函数模式

function f1(f2) {

    //f1要执行的一些代码

    if (f2 && typeof(f2) === "function") { //对f2做判断是否存在并且是一个函数
        f2();
    }

}

这里要注意两点 参数里的f2是一个指向f2这个函数的指针所以f2后面不能加括号
而f1内部的f2后面要有括号 因为这时我们要调用执行f2 ,所以要写f2()

我们把这个模式实例化看下他的执行结果

声明函数

function f1(f2) {
    alert("我是f1");
    if (f2 && typeof(f2) === "function") { //写上判断是个好习惯
        f2()
    }
}

执行

f1(function() {
    alert("我是f2");
})

结果:
//"我是f1",“我是f2”

我们看下整个函数执行的过程 当调用 f1(function(){alert("我是f2");})的时候
首先把一个匿名函数传给了f1() 而这个匿名函数就是声明函数里的参数f2 javascript程序是从上到下执行 先执行了alert("我是f1"); 然后执行了f2();

那我们可不可以这样写呢

function f1(f2) {
    alert("我是f1");
    if (f2 && typeof(f2) === "function") {  
        f2()
    }

    alert("我又是f1 哈哈");
}
执行
f1(function(){
    alert("我是f2");
})

//结果:我是f1 ,我是f2,我又是1 哈哈

再看对callback的定义 ,我们可以让callback在我们想要执行的时候执行,不影响f1本身的执行流

但为了封装和美观大多数我们会这样写

function f1(f2){
     
    if (f2 && typeof(f2) === "function") {  
        settimeOut(function(){f2()},1000) ;//f1执行1s后f2执行
    }
}

function f2(){
    /**/
}

f1(f2);

  

我们平常会经常用到callback

比如jQuery里的一个例子

$("#div1").fadeOut("fast",functin(){
    $("#div2").fadeIn("slow");
})

让#div快速隐藏然后让#div2渐渐显示,在jQuery里有大量的callback函数

并且有一个专门的有一个方法callbacks来管理

jQuery.Callbacks = function( options ) {...}

最后说下我最在项目中用到的callback吧
hybrid app 功能大概就是 我向ios发送一个请求 ios返回给我的json数据 然后我将返回的数据解析插入到web页面上

//首先我写一个javascript和ios通信callback函数(简化)
getData(callback){
    settimeOut(function(){callback(iso_return)},100);
}

//然后我向ios发送一个请求
function getSinersReuest(){
    window.location.href="vvmusic://....callback=getSinersData"
}
/*然后ios截获url中的callback执行getData(getSinersData)返回给我数据;getSinersData是把ios返回的json插入到页面显示*/


getSinersData(iso_return){
    .........
}


//当页面加载的时候调用
window.onload=function(){
    getSinersReuest();
}

 

 

目录
相关文章
|
23天前
|
JavaScript
js函数封装 —— 金额添加千分位分隔符
js函数封装 —— 金额添加千分位分隔符
17 2
|
20天前
|
JavaScript
js 延时执行代码的最佳实践 —— 自定义 sleep 函数
js 延时执行代码的最佳实践 —— 自定义 sleep 函数
15 0
|
21天前
|
JavaScript
js 高频实用函数封装汇总(持续更新)
js 高频实用函数封装汇总(持续更新)
14 0
|
22天前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
15 0
|
22天前
|
JavaScript
js 调试 —— 断点(含进入函数、条件断点等)
js 调试 —— 断点(含进入函数、条件断点等)
22 0
|
22天前
|
JavaScript
JS【详解】函数.bind()
JS【详解】函数.bind()
9 0
|
22天前
|
JavaScript
js 【详解】函数中的 this 指向
js 【详解】函数中的 this 指向
19 0
|
22天前
|
存储 JavaScript 前端开发
|
23天前
|
前端开发 JavaScript
前端 JS 经典:箭头函数的意义
前端 JS 经典:箭头函数的意义
12 0
|
23天前
|
前端开发 JavaScript
前端 JS 经典:函数签名
前端 JS 经典:函数签名
13 0