两种类型的回调函数
回调函数:
- 自己定义的函数
- 不是自己调用
- 由系统进行调用
eg:setTimeout
不是回调函数,因为它不是我们自己定义的
同步回调
- 理解:立即执行,完全执行完了才结束,不会被放到回调队列中
- 栗子:数组遍历的相关回调函数、Promise的
executor
函数
异步回调
- 理解:不会被立即执行,会将其放到回调队列中将来执行
- 栗子:定时器回调、ajax回调、promise的成功/失败回调
注意:
【宏队列】:定时器回调、ajax回调、dom事件回调
【微队列】:promise回调、mutationObserver回调
1.JS中必须先执行完所有的初始化同步任务代码
2. 每次准备取出第一个宏任务执行之前,都要将所有的微任务一个一个的取出来执行。
例如:forEach里面的回调(同步回调)
const arr = [1,3,23,0];
arr.forEach(item => {
console.log(item);
})
console.log('我是forEach后面的同步代码');
运行结果:
1
3
23
0
我是forEach后面的同步代码
例如:定时器里面的回调(异步回调)
setTimeout(()=>{
console.log('我是setTimeout里面的代码!');
})
console.log('我是setTimeout之后的同步代码');
我是setTimeout之后的同步代码
我是setTimeout里面的代码!
常见的内置错误
ReferenceError
: 引用的变量不存在TypeError
: 数据类型不正确的错误RangeError
: 数据值不在允许的范围内SyntaxError
: 语法错误
例如:ReferenceError
<script>
console.log(a);
</script>
运行结果:
例如:TypeError
<script>
const n = null;
console.log(n.name);
</script>
运行结果:
<script>
const n = undefined;
console.log(n.name);
</script>
运行结果:
<script>
let n;
console.log(n.name);
</script>
运行结果:
注意:
<script>
let n;
console.log(n);
</script>
运行结果:不会报错
例如:RangeError
<script>
function fn() {
fn();
}
fn();
</script>
运行结果:
例如:SyntaxError
<script>
const str = '''';
</script>
处理错误
- 捕获错误:
try{}...catch(error){}
- 抛出错误 :
throw error