前端知识之查漏补缺二

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.性能问题

     使用闭包时,会涉及到跨作用域访问,每次访问都会导致性能损失。

  

原文地址:https://www.cnblogs.com/tllw/p/15405465.html