通过字符串

时间:2018-05-19 14:43:19

标签: javascript node.js closures

在JavaScript async function中,我想检查其闭包环境中是否有某个函数可用。

该功能可用。我可以明确地执行它,或者执行console.log(myClosureScopedFunc)

但是当函数的名称在字符串变量中时,我如何才能看到它是否存在于闭包中?

  • async function中,this未定义,否则我可以if (this['myClosureScopedFunc']) // gotcha
  • 由于一些可能显而易见的原因,我不能self = thismyClosureScopedFunc在同一范围内,因为self undefinedasync 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" } 对象中。然后我们可以按预期使用它:

*

1 个答案:

答案 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');