Javascript 打字稿-“;这";在非arrow类方法中未定义

Javascript 打字稿-“;这";在非arrow类方法中未定义,javascript,typescript,this,Javascript,Typescript,This,我知道JS和TS中的“这个”主题已经被许多问题所涵盖,但我还没有找到我所面临的具体问题的答案。我敢肯定,我只是不理解一些基本的东西,在谷歌上搜索可以归结为箭头函数范围规则的堆积如山的问题是很棘手的 在前言中,我正在努力解决的代码是在一个节点后端上运行的 因此,我创建了一个控制器类,其方法未定义为箭头函数(简化为演示): …然后它就按预期工作了 我相信我了解arrow function此捕获如何与周围范围相关;但在这种情况下,我觉得我错过了两个关键的理解: 为什么第一个方法没有任何此?我觉得这个

我知道JS和TS中的“这个”主题已经被许多问题所涵盖,但我还没有找到我所面临的具体问题的答案。我敢肯定,我只是不理解一些基本的东西,在谷歌上搜索可以归结为箭头函数范围规则的堆积如山的问题是很棘手的

在前言中,我正在努力解决的代码是在一个节点后端上运行的

因此,我创建了一个控制器类,其方法未定义为箭头函数(简化为演示):

…然后它就按预期工作了

我相信我了解arrow function
捕获如何与周围范围相关;但在这种情况下,我觉得我错过了两个关键的理解:

  • 为什么第一个方法没有任何此
    ?我觉得
    这个
    应该是
    用户控制器
    的实例,如果不是,那么至少应该是一些更全局的对象
  • 为什么第二种方法有效?没有“周围范围”可从中捕获此-是否存在
下面是如何调用
getUsers()

import UserController from 'user.controller';

userRouter.get('/', authMiddleWare, UserController.getUsers);

问题是您在哪里调用
getUsers
,您没有向我们展示。“为什么第二个方法可以工作?没有“周围范围”来捕获它-是吗?”是的,有:您所做的是在公共属性上有一个初始值设定项<属性初始值设定项的code>this就是构造函数中的this。(事实上,属性初始值设定项在调用
super
(如果有的话)之后被重新定位到构造函数中。)当您查看如何调用
getUser
,您几乎肯定会发现(很可能)和/或(更一般地说)涵盖了该问题
UserController.getUsers
应该是
UserController.getUsers.bind(UserController)
。参见TJ的链接问题。否则,您将向非arow函数传递一个松散引用,这就是为什么这是未定义的。如果你不在严格模式下,这将是一个全局对象。如果你仔细阅读这些问题,你应该能够理解这是一个重复的,正如我上面提到的。强烈建议使用标准的TypeScript/JavaScript命名约定,例如从“user.controller”导入控制器,而不是将类的名称用于insatnce。这只会误导任何试图阅读代码的人。问题是你在哪里调用
getUsers
,你还没有向我们展示。“第二种方法为什么会起作用?没有“周围范围”来捕获它-是吗?”是的,有:你所做的是在公共属性上有一个初始值设定项<属性初始值设定项的code>this就是构造函数中的this。(事实上,属性初始值设定项在调用
super
(如果有的话)之后被重新定位到构造函数中。)当您查看如何调用
getUser
,您几乎肯定会发现(很可能)和/或(更一般地说)涵盖了该问题
UserController.getUsers
应该是
UserController.getUsers.bind(UserController)
。参见TJ的链接问题。否则,您将向非arow函数传递一个松散引用,这就是为什么这是未定义的。如果你不在严格模式下,这将是一个全局对象。如果你仔细阅读这些问题,你应该能够理解这是一个重复的,正如我上面提到的。强烈建议使用标准的TypeScript/JavaScript命名约定,例如从“user.controller”导入控制器,而不是将类的名称用于insatnce。这只会误导任何试图阅读代码的人。
class... {
    public getUsers = async (x, y): Promise<any> => {
        return this.processRequest( ... );
    }
}
import UserController from 'user.controller';

userRouter.get('/', authMiddleWare, UserController.getUsers);