回调函数

回调函数:

在JS中,函数就是一种对象。它有对象应该有的所有操作:

  • 存在变量名中
  • 当作参数传到另一个函数中
  • 在函数中被创建
  • 在函数中被返回

所以,我们可以把函数当作变量传到另一个函数里,传进去之后执行甚至返回等待之后的执行。这就是callback函数的本质。

 

对普通函数的调用:调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”

回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

 

当我们把一个callback函数当作采纳书传到另一个函数中,我们只是传入了函数的定义,而并没有执行这个函数。(因为我们当作参数传入函数的时候并没有在定义之后加上()符号,因为函数名后面加上括号才代表要执行它了)。

一个函数由于被传入了callback函数当作参数,他就可以随时执行这个传进来的callback函数。

callback函数其实是一个闭包,因此callback函数可以访问到包含它的函数的变量,甚至可以访问到全局变量

var inOrderTraverseNode = function (node, callback) {    

if (node !== null) { 

    inOrderTraverseNode(node.left, callback); 

    callback(node.key);            

   inOrderTraverseNode(node.right, callback);  

} }; 

就是一个递归的过程,在inOrderTraverseNode这个方法中,每次判断当前节点是不是null,不是null就接着执行inOrderTraverseNode(node.left,callback);,就是遍历左子树,一旦遍历到左子树的叶子结点后一个,此时就是null了,if里面就不会就不会执行,就会跳转到递归的上一步,也是就是左子树的叶子结点(null节点的上一个),这时程序是处于if判断里面的,而inOrderTraverseNode(node.left,callback);这条语句执行过了,所以就执行下面一条语句,就是你的callback,输出key,又执行下一条语句inOrderTraverseNode(node.right,callback);,即从右子树开始中序遍历。

“一旦遍历到左子树的叶子结点后一个,此时就是null了,if里面就不会就不会执行,就会跳转到递归的上一步”,不会执行我明白,但为什么不执行会跳转到递归的上一步呢?if条件不满足不是指教跳到函数末尾,函数结束吗?、

看来你是没有理解什么是递归,建议你看看这个:https://www.zhihu.com/questio...

我的理解:当判断没有达到一个临界值的时候,函数会不断的调用函数本身,知道其中的条件不成立。在整个程序之心过程中,程序在进入下一次递归时,会保存当前的内存地址(一般是用栈来保存),当不能继续递归时,这时候栈就起作用了,以先进后出的方式执行栈中保存的内存地址

下面举个例子:

function A(callback) {    //不是callback(),回调函数作为参数的时候仅以函数定义的形式被传进去,而不是以函数调用的形式,因为没加()
    callback();    //此时即使调用callback();也不会先执行它,因为它作为参数传进来的时候是以回调函数的身份进来的。
    console.log('我是主函数');      
}

function B(){
    setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作  
}

//调用主函数,将函数B传进去
A(B);

//输出结果
我是主函数
我是回调函数

上面的代码中,我们先定义了主函数和回调函数,然后再去调用主函数,将回调函数传进去。

  定义主函数的时候,我们让代码先去执行callback()回调函数,但输出结果却是后输出回调函数的内容。这就说明了主函数不用等待回调函数执行完,可以接着执行自己的代码。所以一般回调函数都用在耗时操作上面。比如ajax请求,比如处理文件等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值