发表于: 2019-12-27 22:04:37
1 1344
对于回调函数今天再次深入学习理解一下
什么是回调函数?
回调函数是一个作为变量传递到另外一个函数的函数,它在主体函数执行完之后执行
可能听着有点绕,下面用代码说话。
//定义主函数,回调函数作为参数
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.看官网代码
遇到的问题:
代码看起来有点头疼
收获:
回调函数理的比较清楚了。
评论