第 2 章 手写Promise前置知识

81 阅读2分钟

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 同步回调

  1. 理解: 立即执行, 完全执行完了才结束, 不会放入回调队列中

  2. 例子: 数组遍历相关的回调函数 / Promise 的 excutor 函数

2.2.2. 异步回调

  1. 理解: 不会立即执行, 会放入回调队列中将来执行
  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. 错误的类型

  1. Error: 所有错误的父类型
  2. ReferenceError: 引用的变量不存在
  3. TypeError: 数据类型不正确的错误
  4. RangeError: 数据值不在其所允许的范围内
  5. 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. 错误处理

  1. 捕获错误: try ... catch

  2. 抛出错误: 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 对象的结构

  1. message 属性: 错误相关信息
  2. stack 属性: 函数调用栈记录信息