2.1. 区别实例对象与函数对象
- 实例对象: new 函数产生的对象, 称为实例对象, 简称为对象
- 函数对象: 将函数作为对象使用时, 简称为函数对象,即 Function的实例对象。
function Fn() {
}
const fn = new Fn() // fn 是 实例对象
console.log(Fn.prototype) // Fn 称作 函数对象
Fn.bind({}) // Fn 可称作 函数对象
$('#test') // jQuery函数
$.get('/test') // jQuery函数对象
2.2 两种类型的回调函数
2.2.1 同步回调
-
理解: 立即执行, 完全执行完了才结束, 不会放入回调队列中
-
例子: 数组遍历相关的回调函数 / Promise 的 excutor 函数
2.2.2. 异步回调
- 理解: 不会立即执行, 会放入回调队列中将来执行
- 例子: 定时器回调 / ajax 回调 / Promise 的成功|失败的回调
arr.forEach(item => { // 遍历回调, 同步回调函数, 不会放入列队, 一上来就要执行完
console.log(item)
})
console.log('forEach()之后')
// 2. 异步回调函数
setTimeout(() => { // 异步回调函数, 会放入队列中将来执行
console.log('timout callback()')
}, 0)
console.log('setTimeout()之后')
2.3 JavaScript的 error 处理
2.3.1. 错误的类型
- Error: 所有错误的父类型
- ReferenceError: 引用的变量不存在
- TypeError: 数据类型不正确的错误
- RangeError: 数据值不在其所允许的范围内
- SyntaxError: 语法错误
ReferenceError
console.log(a) // ReferenceError: a is not defined
console.log('-----') // 没有捕获error, 下面的代码不会执行
TypeError: 数据类型不正确的错误
let b
console.log(b.xxx) // TypeError: Cannot read property 'xxx' of undefined
let a = {}
a.xxx() // TypeError: a.xxx is not a function
2.3.2. 错误处理
-
捕获错误: try ... catch
-
抛出错误: throw error
try {
let d
console.log(d.xxx)
} catch (error) {
console.log('message',error.message) // 错误信息
console.log('stack',error.stack) // 错误信息+代码位置
}
console.log('出错之后') // 捕获错误后,不阻断后续代码执行
2.3.3. error 对象的结构
- message 属性: 错误相关信息
- stack 属性: 函数调用栈记录信息