java 当 this 不指向模块而是指向全局范围时,脚本如何访问同一模块中的函数

java script how to access function within the same module when this doesn't point to the module instead points to the global scope

这样调用模块中的函数时

app.get("/api/sessions/oauth/google", (req, res) => {
  return google_callback.googleOAuthHandler(req, res);
});

this 指向模块,可以使用 this

访问模块中的另一个函数
googleOAuthHandler : async function (req, res) {
  const code = req.query.code.toString();
  const {id_token, access_token} = await this.getGoogleOAuthToken(code);
}

然而,将函数作为参数传递会将 this 更改为全局,并且 this.getGoogleOAuthToken 变为未定义 即做

app.get("/api/sessions/oauth/google", google_callback.googleOAuthHandler);

使用这种方式时,我将如何访问 google_callback 模块中的 googleOAuthHandler 中的 getGoogleOAuthToken

app.get("/api/sessions/oauth/google", google_callback.googleOAuthHandler);

以这种方式传递函数时 this 并不意味着 module。所以 this.getGoogleOAuthToken 不起作用。

但是我们可以使用 module.exports.getGoogleOAuthToken 来访问同一模块中的函数。使用 module.exports.getGoogleOAuthToken 也适用于第一个示例。

或者,如果您不喜欢 module.exports 调用该函数,您可以将行 const _this = this; 放在文件顶部或 const _this = module.exports = { ... } 并使用 _this.function 来在模块内调用函数。

还注意到在第一个示例中 this.function 之所以有效,是因为我使用的是这种语法。

module.exports = {
  func1 : function(){},
  func2 : function(){}
}

导出时

module.exports.func1 = function(){}
module.exports.func2 = function(){}

this不能用于访问其他函数