Promise & JS中闭包

152 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情 >


Promise及其底层如何实现

Promise 是一个对象,保存着未来将要结束的事件; 她有两个特征:

1 对象的状态不受外部影响,Promise 对象代表一个异步操作,有三种状态,pending 进行中,fulfilled 已成功,rejected 已失败,只有异步操作的结果,才可以决定当前是哪 一种状态,任何其他操作都无法改变这个状态,这也就是 promise 名字的由来

2 一旦状态改变,就不会再变,promise 对象状态改变只有两种可能,从 pending 改到 fulfilled 或者从 pending 改到 rejected,只要这两种情况发生,状态就凝固了,不会再改 变,这个时候就称为定型 resolved

//Promise的基本用法,
let promise1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve('ok')
    }, 1000)
})
promise1.then(function success(val) {
    console.log(val)
})

//最简单代码实现

class PromiseM {
    constructor(process) {
        this.status = 'pending'
        this.msg = ''
        process(this.resolve.bind(this), this.reject.bind(this))
        return this
    }

    resolve(val) {
        this.status = 'fulfilled'
        this.msg = val
    }

    reject(err) {
        this.status = 'rejected'
        this.msg = err
    }

    then(fufilled, reject) {
        if (this.status === 'fulfilled') {
            fufilled(this.msg)
        }
        if (this.status === 'rejected') {
            reject(this.msg)
        }
    }
}

//测试代码
let mm = new PromiseM(function (resolve, reject) {
    resolve('123');
});
mm.then(function (success) {
    console.log(success);
}, function () {
    console.log('fail!');
});

JS闭包是什么?

MDN 对闭包的定义是:闭包是指那些能够访问自由变量的函数,自由变量是指在函数 中使用的,但既不是函数参数又不是函数的局部变量的变量,由此可以看出,闭包=函 数+函数能够访问的自由变量,所以从技术的角度讲,所有 JS 函数都是闭包,但是这是 理论上的闭包,还有一个实践角度上的闭包,从实践角度上来说,只有满足

1、即使创 建它的上下文已经销毁,它仍然存在,

2、在代码中引入了自由变量,才称为闭包

闭包的应用: 模仿块级作用域。2、保存外部函数的变量。3、封装私有变量

//单例模式:
let Singleton = (function () {
    let instance;
    let CreateSingleton = function (name) {
        this.name = name;
        if (instance) {
            return instance;
        }
        // 打印实例名字
        this.getName();
        // instance = this;
        // return instance;
        return instance = this;
    }
        // 获取实例的名字
    CreateSingleton.prototype.getName = function () {
        console.log(this.name)
    }
    return CreateSingleton;
})();
// 创建实例对象 1
let a = new Singleton('a');
// 创建实例对象 2
let b = new Singleton('b');
console.log(a === b);

如果有哪里描述不准确或者有问题,欢迎大佬指正!
(≖ᴗ≖)✧