实践的过程真是可以发现问题的过程的,自我总结的过程,使用nodeJs的过程中express的回调真的是太难受了,学习的时候感觉demo比较小,没感觉出来,但是等做东西之后,我的Tian简直忍受不了,回调嵌套一层一层又一层,别着急写完这层还有下一层(喝完这杯还有下一杯),人总是懒惰的,于是就想有没有回调的好方法,于是找到了promise和async/await的异步调用方法,这里先不说。突然意识到我去,函数调用模糊不清。
- 回调 先上英文定义:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。 用我蹩脚的英文二级水品翻译一下:回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。
举个别人的栗子(果然自己家的栗子没有别人家的好吃):约会结束后你送你女朋友回家,离别时,你肯定会说:“到家了给我发条信息,我很担心你。” 对不,然后你女朋友回家以后还真给你发了条信息。小伙子,你有戏了。其实这就是一个回调的过程。你留了个参数函数(要求女朋友给你发条信息)给你女朋友,然后你女朋友回家,回家的动作是主函数。她必须先回到家以后,主函数执行完了,再执行传进去的函数,然后你就收到一条信息了。
function a(callback){
callback();
console.log("主函数执行完了!");
}
function b(){
setTimeout(function(){
console.log("回调函数b");
}, 3000); // 这里是模仿耗时操作
}
// callback函数以参数形式传递,保证变量的灵活性
a(b);
- 普通的函数调用和回调函数有什么区别呢?
function a(){
b();
console.log('hello world');
}
function b(){
var n = 0;
for(var i = 0;i < 1000000000;i++){
n++;
}
return n;
}
a(); //hello world
function a(callback){
callback.call(this);
console.log('hello world');
}
function b(){
var n = 0;
for(var i = 0;i < 1000000000;i++){
}
console.log(1);
}
a(b); //hello world
- 性能没有区别
- 回调函数是作为参数传递的,操作更加灵活,比如,你可以定义一个函数c,那可以运行b(c),普通的函数调用当你在函数内运行函数的时候,就失去了变量的灵活性。
- 可以通过回调函数来实现异步 假定有两个函数f1和f2,后者等待前者的执行结果。
f1();
f2();
f1是一个很耗时的任务,那么就可以考虑改写f1将f2写成f1的回调函数
function f1(callback){
setTimeout(function () {
console.log("f1的任务代码");
}, 3000);//模拟一个耗时的操作
callback();
}
function f2(){
console.log("f2的任务代码");
}
// 执行
f1(f2)