`this`在对象内部未定义

时间:2020-04-15 02:04:44

标签: node.js this

使用Node.js,我正在调用一个名为customFunction的函数,该函数是GrpahQL解析器的一个变体。我没有访问this的权限。

import { Mutation } from './mutation/Mutation'
export default {
  Query,
  Mutation,
}

然后在Mutation.ts

import { customFunctionMutation } from './customFunctionMutation'
export const Mutation = {
  customFunction: customFunctionMutation.customFunction,
}

然后在customFunctionMutation.ts

export const customFunctionMutation = {
  test() {
    console.log('test called')
  },
  async customFunction(parent: any, args: any, ctx: any, info: any) {
    console.log('customFunction init')
    console.log('this', this)
    this.test()
    console.log('customFunction end')
  },
}

这是undefined,我不能调用同一对象中的函数test()

enter image description here

2 个答案:

答案 0 :(得分:2)

执行此操作时,已将方法与具有test方法的对象分开:

import { customFunction } from './customFunction'

因此,当您尝试调用customFunction()时,它将与在其内部声明的对象没有关联,因此它无法引用this.test(),因为this将是{ {1}}。

仅供参考,为出口指定相同的名称,并在出口上设置属性会给您的客户带来混乱。请不要这样做。


我建议通过使模块独立于将其更改为不再使用undefined来调用它的方式来对其进行修复:

this

然后,您可以使用:

const moduleObj = {
  test() {
    console.log('test called')
  },
  async customFunction(parent: any, args: any, ctx: any, info: any) {
    console.log('customFunction init')
    console.log('this', this)
    moduleObj.test()
    console.log('customFunction end')
  },
}

export default moduleObj;

然后,您可以致电:

import { customFunction } from './customFunction'

,它在被调用时将能够正常运行。

答案 1 :(得分:1)

其中一种可能有效:

import { customFunction } from './customFunction'
export const Mutation = {
  customFunction: customFunction.customFunction.bind(customFunction),
}

import { customFunction } from './customFunction'
export const Mutation = customFunction

import { customFunction } from './customFunction'
export const Mutation = {
  customFunction: function functionName(...parameters) { return customFunction.customFunction(...parameters); },
}