发表于: 2019-12-27 22:04:37

1 1346


对于回调函数今天再次深入学习理解一下

什么是回调函数?

回调函数是一个作为变量传递到另外一个函数的函数,它在主体函数执行完之后执行

可能听着有点绕,下面用代码说话。

//定义主函数,回调函数作为参数
function main(callback){
   callback();
   console.log('我是主函数');
}

//定义回调函数
function back(){
   setTimeout("console.log('我是回调函数')",2000)
}

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

//我是主线程普通任务
console.log("普通任务");

<span md-inline="plain" 那么输出的结果也就显而易见了。<="" span="" style="word-break: break-all;">

其中回调函数使用了计时器,模拟了一下耗时操作。

可以看到优先运行完主线程任务,然后回调函数再运行。

回调函数是异步吗?

切记,<span md-inline="strong" 回调函数并不一定是异步,这里的异步是因为计时器的原因。setTimeout才是异步

<span md-inline="plain" 回调函数的异步与否要看函数里的任务,而回调函数本身并不是异步。<="" span="" style="word-break: break-all;">

<span md-inline="plain" 如果把计时器去掉,那么就是正常的运行结果。<="" span="" style="word-break: break-all;">

回调函数本质?

<span md-inline="strong" 接下来我们再深入

回调函数是不是和某个东西长得有点像?对咯

就是<span md-inline="strong" 闭包

回顾下闭包的概念:<span md-inline="strong" 闭包是指有权访问另一个函数作用域的变量的函数

那么回调函数能不能访问主函数作用域的变量呢?

<span md-inline="plain" 答案是肯定的。<="" span="" style="word-break: break-all;">

//定义主函数
function main(callback){
   let name = "小明"
   callback(name);
}

//定义回调函数
function back(name){
   console.log('name', name);
}

main(back);

再稍微复杂一点

var obj = {
   name: '小明',
   age: 18
}
//主函数
function main(obj, callback) {
   callback(obj)
}
//回调函数
function back(data) {
   console.log(data.name)
}

main(obj,back);

回调函数简单好用,但是关于回调函数解决异步这点,大多数人都有误解

小课堂题目之异步编程有哪几种办法来实现?其中基本上所有人都是照抄网上的方法,说回调直接就能解决异步问题,不阻塞程序运行。其实都是靠setTimeout来实现的异步。

再次强调,回调函数本身并不是异步。

如果回调函数实现了异步,没有阻塞程序运行,那么一定是它其中的异步操作的原因。

2.checkout官网代码

checkout下来的时候懵了一下,102M,有点大啊。。

文件错综复杂,app路由就2000多行,看起来有点生涩难懂,唉,慢慢看吧。

明天计划的事:

1.看官网代码

遇到的问题:

代码看起来有点头疼

收获:

回调函数理的比较清楚了。




返回列表 返回列表
评论

    分享到