回调函数概念
回调函数是一个作为参数传递给另一个函数的函数,它在主体函数执行完之后再执行。它是解决异步问题的方案之一。
// 定时器回调函数
const log1 = () => {
console.log(1)
}
setTimeout(log1, 1000);
// 将匿名函数作为参数传递给了另一个函数或方法
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (eachName, index){
console.log(index + 1 + ". "+ eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick
});
回调函数特点
1、不会立即执行
回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。和普通的函数一样,回调函数在调用函数中也要通过()运算符调用才会执行。
2、回调函数是一个闭包
回调函数是一个闭包,也就是说它能访问到其外层定义的变量。
3、执行前类型判断
在执行回调函数前最好确认其是一个函数。
function add(num1, num2, callback) {
var sum = num1 + num2;
//判定callback接收到的数据是一个函数
if (typeof callback === 'function') {
//callback是一个函数,才能当回调函数使用
callback(sum);
}
}
回调函数的缺点
- 回调函数有一个致命的弱点,就是容易写出回调地狱(Callback hell),回调地狱表现为:
- 嵌套函数存在耦合性,一旦有所改动,就会牵一发而动全身
- 嵌套函数一多,就很难处理错误
- 不能使用 try catch 捕获错误
- 不能直接 return
常见的回调函数
- DOM事件回调函数
- 定时器回调函数
- ajax 请求回调函数
- 生命周期回调函数
如何解决回调函数?
- promise
- async/await
- generator