函数和对象怎么区分?
调用的区别:()左边是函数,. 的左边是对象对象有属性和方法,函数是一个方法对象分为实例对象和函数对象实例对象:new函数产生的对象(多个)函数对象:将函数当做对象来使用时(一个)满足回调函数的三个条件? 1.自定义的函数 2.自己不亲自调用 3.函数自己执行了同步回调函数:不会放入任务队列,立即执行异步回调函数:放入任务队列,将来执行js事件循环机制?1.主线程先同步执行代码, 2.遇到异步任务,交给异步进程处理,3.异步进程处理完毕之后,将任务放到任务队列中, 4.主线程执行完毕之后,查询任务队列,如果存在任务就取出任务执行 5.循环2 3 4try … catch 和 throw 的区别?try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。promise是什么?抽象:js中进行异步编程的一种解决方案具体: 1.语法上,promise是一个构造函数 2.功能上,promise对象封装一个异步操作并获取结果promise的状态改变?只有两种:pending --> resolvedpending --> rrjected一个promise对象的状态只能改变一次无论成功还是失败都会有一个结果数据,成功的结果数据一般称为value,失败为reasonpromise执行过程? 1.创建promise对象 2.执行异步操作 3.成功则调用resolve() 失败则调用reject() 4.执行相应的回调函数const p = new Promise((resolve,reject) => { setTimeout(()=>{ const time = Date.now() if(time%2==0){ resolve(“成功的数据”) } else { reject(“失败的数据”) } })})p.then( value => { console.log(“成功的回调”, value) }, reason => { console.log(“失败的回调”, reason) })什么是回调地狱?回调函数嵌套使用,外部回调函数执行的结果是内部回调函数执行的条件缺点:不便于阅读,不便于异常处理解决方案:promise链式调用async/await(终极解决方案)为什么要使用promise,有什么优点?1.处理回调函数很方便旧方法(纯回调函数:也就是直接把函数当做参数来调用):必须在异步任务开始前指定回调函数promise可以在任务结束后再指定回调函数 2.支持链式调用,可以解决回调地狱问题(promise的.then方法,指定成功和失败的回调方法,会返回新的promise对象,是链式调用的前提)promise执行器?promise构造函数本身接受一个执行器,而执行器接受两个函数,一个是resolve函数(内部定义成功时的回调函数),一个是reject函数(内部定义失败的回调函数)。执行器在promise内部立即同步回调,异步操作在执行器里面执行。如果定义了多个回调,回都执行吗?会,会执行相应的所有成功/失败回调promise状态的改变?resolve() pending --> resolvedreject() pending --> rejectedthrow new Error() pending --> rejected怎么先改状态再指定调用函数?如果执行器里面有定时器,定时器里面有resolve()和reject()两个改变promise状态的函数,而指定回调函数的.then()里面没有回调函数,那么这属于先指定回调函数,因为定时器属于异步任务那么如何先改变状态?(关键:定时器) 1.执行器里面的去掉定时器 2…then()也加上定时器,但延时更长promise的.then()里面的成功/失败回调函数是同步还异步执行?异步(执行器里面代码是同步执行)promise.then()返回的新promise的结果状态由什么决定?由.then()指定的回调函数执行的结果决定(如果该回调函数没有返回值也没有抛出异常,那么传递的值的undefined)有三种情况: 1.抛出异常,状态变为rejected,reason的值为跑出的异常信息 2.返回的是非promise的任意值(比如return 1),状态变为resolved,value的值为该返回值 3.返回的是一个新的promise,那么状态和返回值就是这个新的promise的状态值和返回值(如return Promise.resolve(2)那么状态变为resolved,value为2)promise 如何串联多个任务操作?使用.then()方法,任务可以是同步和异步(异步操作要用新的promise来封装)什么是promise异常穿/传透?promise的.then()链式调用,可以只在最后指定一个失败的回调(.catch),前面任何操作出了异常,都会传到最后这个失败的回调处理(原因:前面的操作不指定失败回调,相当于reason => {throw reason} )如何中断promise链?使用.then()链式调用时,在中间中断,后面的回调就不再执行办法:在回调函数中返回一个pending状态的promise对象(这样后面的回调就永远等不到resolved或者rejected状态)return new Promise(()=>{})async和await?async的返回值是一个promise对象,该promise对象的状态值由async后面的这个函数的执行结果决定(1.抛出异常 rejected 2.返回新的promise对象 rejected/resolved 3.return一个常数 resolved)await的右边一般是promise对象,只能接收成功的值value,失败的值reason可以用try…catch获得;右边若为表达式时,得到的值就是表达式的值await 必须写在async里面;await可以没有;await的右边如果是promise对象且失败了(不是promise对象也可能会出现异常,比如函数),就会抛出异常,需要用try…catch处理宏队列和微队列?js中用来执行存储回调函数的队列有两个不同特定的队列:宏队列:用来保存等待执行的宏任务(回调)比如定时器,DOM事件回调,ajax回调,微队列:用来保存等待执行的微任务(回调)比如promise回调(.then,catch,finally方法),async/await(await表达式后面的代码),MutationObserber的回调js执行时会区别这两个队列: 1.js引擎首先必须执行所有的初始化任务代码 2.每次取出一个宏任务执行之前,都会判断微队列里面是否有微任务并一个一个取出来执行,再执行宏任务 3.也就是,微任务的优先级>宏任务的优先级
promise
最新推荐文章于 2024-04-27 07:44:20 发布