提问人:Jonnopon3000 提问时间:6/19/2019 最后编辑:Jonnopon3000 更新时间:11/5/2023 访问量:1274
Typescript - “this”在非箭头类方法中未定义 [duplicate]
Typescript - "this" undefined inside a non-arrow class method [duplicate]
问:
这个问题在这里已经有答案了:
如何在回调中访问正确的“this” (15 个答案)
“this”关键字是如何工作的,何时应该使用? (22 个答案)
“箭头函数”和“函数”是否等同/可互换? (4 个答案)
ES6 中箭头函数中的“this”指的是什么? (10 个答案)
19天前关闭。
我知道 JS 和 TS 中的“this”主题已经被许多问题所涵盖,但我无法找到我面临的特定问题的答案。我敢肯定,我只是不了解一些基本的东西,在归结为箭头函数范围规则的堆积如山的问题中,用谷歌搜索是很棘手的。
首先,我正在努力处理的代码在 Node 后端上运行。
因此,我创建了一个控制器类,其方法未定义为箭头函数(简化以进行演示):
class UserController extends AbstractController {
constructor() { ... }
public async getUsers(x, y): Promise<any> {
return this.processRequest( ... ); //processRequest is a protected async definition on AbstractController
}
}
// ...
export default new UserController()
我遇到的问题是里面是,我自然希望它是执行它的实例。this
getUsers()
undefined
UserController
如果我确实转换为箭头函数...getUsers
class... {
public getUsers = async (x, y): Promise<any> => {
return this.processRequest( ... );
}
}
...然后它按预期工作。
我相信我了解箭头函数捕获在周围范围方面的工作原理;但在这种情况下,我觉得我错过了两个关键的理解:this
- 为什么第一种方法没有?我觉得应该是 的实例,如果不是,那么至少它应该是一些更全局的对象。
this
this
UserController
- 为什么第二种方法有效?没有“周围范围”可以捕获 - 是吗?
this
调用方式如下:getUsers()
import UserController from 'user.controller';
userRouter.get('/', authMiddleWare, UserController.getUsers);
答:
0赞
Ehsan Moallaee
11/5/2023
#1
这取决于你如何调用你的方法, 在常规函数中,其内部的 this 值是动态的,这取决于函数的调用方式。 与常规函数不同,箭头函数没有自己的此绑定。如果我们在箭头函数中访问 this,它将返回最接近的非箭头父函数的 this。 箭头函数中的 this 值是在声明时确定的,并且永远不会更改。所以 call、apply、bind 不能改变箭头函数的值。 这篇文章完整地解释了它: 如何在回调中访问正确的“this”
评论
getUsers
this
this
super
getUser
UserController.getUsers
应该是 .请参阅TJ的链接问题。否则,您将传递对非 arow 函数的松散引用,这就是未定义的原因。它将是您未处于严格模式的全局对象。如果你仔细阅读问题,你应该能够理解UserController.getUsers.bind(UserController)
import controller from 'user.controller'