gpt4 book ai didi

javascript - 为什么速记函数与类一起使用会导致 "this"未定义?

转载 作者:行者123 更新时间:2023-11-29 17:52:42 26 4
gpt4 key购买 nike

jdfiddle: https://jsfiddle.net/2khtof8s/1/

class TestClass {
doSomething(){
return Promise.resolve(this.someFunction('hello'))
}

someFunction( testVar ){
return testVar;
}
}

let instance = new TestClass();

// throws error
Promise.resolve()
.then(instance.doSomething)
.then(console.log)
.catch(console.error);

// works
Promise.resolve()
.then(() => instance.doSomething())
.then(console.log);

// works
Promise.resolve()
.then(function(){return instance.doSomething()})
.then(console.log);

// works
function someFunc(){
return instance.doSomething();
}

Promise.resolve()
.then(someFunc)
.then(console.log);

第一个 Promise.resolve 链错误 Uncaught (in promise) TypeError: Cannot read property 'someFunction' of undefined - 我们似乎无法理解为什么,有没有人有任何洞察力这种行为?据我们所知,似乎应该没有区别

最佳答案

当您传递对实例函数的引用时,上下文会丢失。

instance.doSomething // just a reference

只是一个没有上下文的引用。为了完成您想要做的事情,您需要将上下文绑定(bind)到引用:

instance.doSomething.bind(instance)

这样想可能会有所帮助:

当你引用 instance.doSomething 时,可以把它想象成在说,“我是 instance,这就是 doSomething 的样子,以及如果你调用我,我会使用什么。”

区别在于引用调用

引用:

instance.doSomething

调用:(维护上下文):

instance.doSomething();

class TestClass {
doSomething() {
return Promise.resolve(this.someFunction('hello'))
}

someFunction(testVar) {
return testVar;
}
}

let instance = new TestClass();

// No longer throws error
Promise.resolve()
.then(instance.doSomething.bind(instance))
.then(console.log)
.catch(console.error);

关于javascript - 为什么速记函数与类一起使用会导致 "this"未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41859595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com