1.promise的优缺点
缺点:
1.一旦开始无法取消
2.pending过程中,无法知道具体执行到哪个阶段是刚开始还是即将结束
3.不设置回调函数,错误无法抛出到外部
优点:
1.解决回调地狱,层层嵌套的问题,改为链式结构
2.更好地进行错误捕获,在层层嵌套的模式中使用定时器来抛出异常,但是由于执行栈和原函数不同,无法抛出错误,而promise reject即可
Q: promise 中then 块默认会向下顺序执行,return 是不能中断的,可以通过 throw 来跳转至 catch 实现中断
function fetch(callback) { setTimeout(() => { throw Error('请求失败') }, 2000) } try { fetch(() => { console.log('请求处理') // 永远不会执行 }) } catch (error) { console.log('触发异常', error) // 永远不会执行 } // 程序崩溃 // Uncaught Error: 请求失败 function fetch(callback) { return new Promise((resolve, reject) => { setTimeout(() => { reject('请求失败'); }, 2000) }) } fetch() .then( function(data){ console.log('请求处理'); console.log(data); }, function(reason, data){ console.log('触发异常'); console.log(reason); } );
2.定时器为什么不精确
eventloop循环机制中,异步事件定时器的时间间隔设置,只是把定时器中的执行代码添加到任务队列中的时间,而不是执行时间,任务队列中如果有其他任务,需要等其他任务执行完成后才能继续执行,所以队列中的其他异步执行任务会导致
定时器的不精确
可使用动态计算时差和web Worker来解决
3.闭包的优缺点
闭包: 可以访问局部作用域之外的函数
优点:
1.匿名自执行函数,不会污染全局对象,执行完就回被会被释放
2.缓存,将创建的变量的值始终保持在内存中,例如函数柯里化 const add = a => b => a + b
3.实现封装,封装对象的私有属性和私有方法
缺点:
1.内存消耗
通常来说,函数的活动对象会随着执行期上下文一起销毁,但是,由于闭包引用另外一个函数的活动对象,因此这个活动对象无法被销毁,这意味着,闭包比一般的函数需要更多的内存消耗。使用不当会很容易造成内存泄露。
2.性能问题
使用闭包时,会涉及到跨作用域访问,每次访问都会导致性能损失。