在JavaScript async function
中,我想检查其闭包环境中是否有某个函数可用。
该功能可用。我可以明确地执行它,或者执行console.log(myClosureScopedFunc)
。
但是当函数的名称在字符串变量中时,我如何才能看到它是否存在于闭包中?
async function
中,this
未定义,否则我可以if (this['myClosureScopedFunc']) // gotcha
self = this
与myClosureScopedFunc
在同一范围内,因为self
undefined
中async function
也是eval('myClosureScopedFunc')
。 eval
有效,但出于原因,我不想使用express
。 简约req.params.route
代码示例
路线(要查找的功能)在'use strict'
module.exports = async function(req, res, next) {
try {
if (this[req.params.route].length === 3) // THIS DOES NOT WORK
return await this[req.params.route](req, res, next)
}
catch(err) {
console.log(err.stack)
return res.status(404).end(err.message)
}
}
async function myClosureScopedFunc(req, res, next) {
return await "some async data"
}
中定义。
module
编辑了这个问题,因为它作为半相关案例的副本被关闭了。如果有人通过谷歌结束这里,这里是你在Node.js this
上下文中的具体方式。
我最初的第二个想法(上面的第二点)是正确的,但正如评论者@Bergi指出的那样,exports
关键字范围方法。
因此需要将每个函数添加到'use strict'
const self = this // scope the module
exports.myClosureScopedFunc = myClosureScopedFunc // Add to scope
module.exports = async function(req, res, next) {
try {
if (self[req.params.route].length === 3)
return await self[req.params.route](req, res, next)
}
catch(err) {
console.log(err.stack)
return res.status(404).end(err.message)
}
}
async function myClosureScopedFunc(req, res, next) {
return await "some async data"
}
对象中。然后我们可以按预期使用它:
*
答案 0 :(得分:1)
在模块上定义的函数不会向global
对象公开,因此要按名称访问这些函数,您需要将它们存储在对象中。
在下面的代码片段中,定义了一个funcs
对象,其中包含无法从此模块外部访问的私有函数,因为永远不会导出funcs
。
function require() {
const funcs = {
async myClosureScopedFunc(req, res, next) {
return await "some async data"
}
};
// or
// funcs.myClosureScopedFunc = async function(...) {}
return async function exportedFunc(name) {
if(funcs[name])
console.log(await funcs[name]());
else
console.log('nop');
}
}
const x = require();
x('imNotAFunction');
x('myClosureScopedFunc');