-
()左边是函数,.左边是对象。
-
实例对象可以简称对象。
-
函数对象是指定义的函数用作对象访问方法或者属性时,不可简称为 对象。
-
注意实例对象的方法
-
函数对象的方法
-
函数对象原型上的 方法。
-
回调函数特点:
-
自己定义。
-
不自己调用。
-
最终会被调用。
-
同步回调:不会放入队列,直接调用。
-
异步回调:放入队列,将来执行。
-
内置错误:
-
ReferenceError 引用错误 -
TypeError:类型错误。 -
RangeError 数据值不在允许范围内 -
SytanxError 语法错误 -
错误处理:
-
try-catch捕获。error有两个访问属性:message 和stack,可以让程序继续执行后面的内容。
-
throw error:自己抛出自定义异常。
-
promise:
-
定义:
-
JS中异步编程的新的解决方案(纯回调形式是旧的解决方案)。
-
优势为可以指定回调函数的方式更灵活。可以在异步任务完成后调用都不会有问题,只是此时如果返回结果是失败的话,可能会发出没有绑定onRejected处理函数的警告。
-
纯回调形式必须在启动异步任务之前指定回调函数。
-
具体来说,promise是一个构造函数,promise对象用来封装一个异步操作,并得到结果进行处理。
-
状态改变:
-
pending到resolved。
-
pending到rejected。
-
成功的数据叫value,失败的结果是reason。
-
使用流程:创建promise实例对象,调用异步函数,成功走resolve通道,失败走reject通过;成功变为resolved状态,失败变为rejected状态;成功通过then调用回调函数(onResolved),失败通过then或者catch调用回调函数(onRejected)。
-
promise里面的参数称为执行器函数,是一个同步回调函数。会立即执行。只有异步回调才会被放到队列里面。
-
回调地狱问题:
-
使用纯回调函数进行回调函数嵌套,多个异步函数的串联使用,前一个异步任务开启由上一个异步任务的结果来决定,造成阅读不方便,代码编写难度大,难以控制异常结果的问题。
-
promise链式调用会解决这个问题,它的异步函数不是嵌套的,并且有异常穿透功能。
-
async/await是解决回调地狱的终极方案。
-
excutor为执行器函数,是同步回调函数。
-
then、catch方法是Promise函数对象原型上的方法。返回一个新Promise对象。
-
resolve(成功值为某值的语法糖)、reject、all、race函数对象的方法。
-
实际使用的时候,可以改名字,是形参。
-
all是有成功都会返回,结果组成一个数组返回。只要有一个失败就返回失败的值,哪个先失败返回哪个。
-
race是哪个第一个返回就返回哪个。(大家都没延时的时候就看排列顺序,有延时的时候按照延时时间,看谁先完成)
-
除了成功和失败状态,还可以有抛出异常状态,抛出异常也是让promise进入rejected状态。
-
如果指定了多个回调函数,改变为相应状态时,都会调用。
-
状态改变和调用异步回调函数的顺序是可以自己控制的。通过给予相关的延时控制。
-
then()返回的Promise的状态由前一个执行回调函数的结果决定。
-
抛出异常。新Promise就会变为rejected状态。
-
返回一个promise,由这个promise结果决定 。
-
非promise值,新promise都会变为resolved状态。
-
新promise默认为resolved状态。
-
promise的链式调用可以串联同步任务和异步任务(包装在promise里面)调用。
-
链式调用时,如果发生错误 ,中奖而没有写错误回调函数,那么会自动调用throw reason把错误透传到最后的错误回调函数。
-
中断promise链,直接return一个new Promise(){},一个处于pending状态的promise。
-
自定义promise。
-
async和await:
async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。相当于写法上更简洁了。 -
async函数:
-
返回promise对象。
-
promise对象结果由async函数的返回值决定。
-
await表达式:
-
右侧的表达式一般为promise对象。
-
如果是promise对象,返回值是promise成功的值。
-
如果不是promise,那么就是返回值本身。
-
await在 async函数里面,如果接收到了异常,那么会直接抛出异常,不会继续执行其他的语句了 。要想执行下面的语句只能用try catch来捕获。
-
await必须使用在async里面。
-
宏队列和微队列:
-
宏队列:
-
dom事件回调。
-
ajax回调。
-
定时器回调。
-
微队列:
-
promise回调。
-
mutation回调(监听标签属性的改变)。
-
JS事件循环机制执行顺序:同步任务首先被执行,期间添加宏任务和微任务,接着优先执行微任务,再执行宏任务。
-
面试相关总结:
-
then()里面回调函数不标注的话,默认是成功的回调函数。
-
记得一个promise的状态只能改变一次,后面改变就无效了。
-
记得连续两个then,如果没有第一个then没有立即返回,那么第二个then会执行,但是不会加入微任务,需等待第一个then执行了才会加入微任务。