请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

手写promise构造器的出错

老师我想问一下为什么我这么写promise的构造器时,为什么resolve方法内部的this为undefined

class MyPromise{
    state = 'pending'
    value = null
    reason = null

    rejectCallbacks = []
    resolveCallbacks = []

    constructor(excutor){
        try{
            excutor(this.resolve,this.reject)
        }catch(error){
            this.reject(error)
        }
       
    }

    resolve(value){
        console.log('resolve:',this)  //undefined
        if(this.state ==='pending'){
            this.value = value
            this.state = 'resolved'

            while(this.resolveCallbacks.length){
                this.resolveCallbacks.shift()(this.value)
            }
        }
    }

但是下面这样写的话,方法中的this就是实例对象

class person{
    constructor(){
        this.name = 'ohh'
       
    }

    say(){
        console.log(this.name) //this为实例对象
    }
}

请问为什么同样是在类方法中使用this,但是一个是undefined,一个是实例对象?

正在回答 回答被采纳积分+3

3回答

双越 2022-03-04 08:20:46

其实就一点:class 函数在被外部调用时,this 是 undefined 。例如

https://img1.sycdn.imooc.com//szimg/62215b5c0916053e07260336.jpg

0 回复 有任何疑惑可以回复我~
双越 2022-03-03 21:37:14

你是把 this.resolve 传递给了 excutor 函数去执行。这样 resolve 内部的 this 就不是 class 实例了。

这就例如

const obj {
    fn() {
        console.log(this)
    }
}
const fn1 = obj.fn
fn1()


0 回复 有任何疑惑可以回复我~
双越 2022-03-03 08:44:43

你是怎么调用的 resolve 函数?我看着代码没啥问题

0 回复 有任何疑惑可以回复我~
  • 提问者 慕丝1117639 #1
    就是直接 let p = new MyPromise((resolve)=>{
         resolve('resolve')
    })
    但是执行类中的resolve方法时,就报错:TypeError: Cannot read properties of undefined (reading 'state')
    请问这是为什么呢?
    回复 有任何疑惑可以回复我~ 2022-03-03 09:46:27
  • 双越 回复 提问者 慕丝1117639 #2
    额,,,我懵了。报错了,怎么还能打印出 this 是 undefined 呢?
    回复 有任何疑惑可以回复我~ 2022-03-03 15:30:23
  • 提问者 慕丝1117639 回复 双越 #3
    打印出undefined是因为我在resoleve方法中第一行打印了this,结果是undefined,因为下面需要使用this.state.由于this是undefined,所以才报错,报错逻辑没问题呀?问题是为什么this是undefined
    回复 有任何疑惑可以回复我~ 2022-03-03 18:57:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信