将每个函数导出为 main 方法的自动方式

Automatic way to export each function as a method of main

我只是创建了一个节点模块,它是一个包含许多函数的单个文件,例如:

function alpha () {
  return 'alpha'
}

function beta () {
  return 'beta'
}

function main () {
  return alpha() + beta() + 'gamma'
}

module.exports = main

这个问题是我真正想要的是所有声明的函数(除了 main)都是 main 的方法,比如 main.alpha(注意 main 在这种情况下不会是具有原型的对象)。我希望所有这些函数都作为方法,这样我仍然可以导出一个函数 main 并能够在该模块之外使用 main.alpha()

话虽如此,我仍然坚持使用模块中的功能,就像我编写它们一样。我可以使用我的文本编辑器(atom 的)查找和替换正则表达式函数将每个函数声明 (function (.+) \() 更改为 main. = function (

我创建的模块中有大约 20 个函数,编辑所有代码非常繁琐且复杂。另一个问题是每个函数名称在使用时变得更容易识别,而不是一个很好的 getFiles 函数我有一个不必要的长 main.getFiles 函数。

我想要的结果是这样的(图 1):

function main () {
  return main.alpha() + main.beta() + 'gamma'
}

main.alpha = function  {
  return 'alpha'
}

main.beta = function () {
  return 'beta'
}

module.exports = main

或这个(图 2)

function alpha () {
  return 'alpha'
}

function beta () {
  return 'beta'
}

function main () {
  return alpha() + beta() + 'gamma'
}

main.alpha = alpha
main.beta = beta

module.exports = main

我的问题是:有没有一种方法可以编写 CommonJS 模块,我可以像上面那样声明函数,并轻松地将所有声明的函数添加到模块中作为方法main?

我唯一的选择似乎是:

  1. 遍历模块中的每个函数,将像这样的函数装饰function (.+) \(替换成像这样的main方法main. = function (,然后遍历找到每个函数的使用并替换它到主要方法。 (图 1)
  2. 在声明 main 和所有函数后的文件末尾,向 main 添加与原始函数相同的方法。 (例如 main.getFiles = getFiles)(图 2)

更新 1

解决此问题的一种方法是在模块的开头和结尾获取 global 变量,然后 diff 它们获取在模块中创建的变量,然后构建一个字符串映射我可以粘贴到模块的末尾,将所有方法分配给主函数。遗憾的是,main 中的新函数声明没有附加到 global。您可以在此处查看 global['main'] 日志 undefined.

function main () {

}

console.log(global['main']) // => undefined

更新 2

我也喜欢这样的解决方案,它允许我向命名函数添加变量定义。我希望能够在内部将其作为命名函数调用,并将其导出为 main 的方法。但这不起作用。

function main () {
  return alpha() + beta() + 'gamma'
}

main.alpha = function alpha () {
  return 'alpha'
}

main.beta = function beta () {
  return 'beta'
}

module.exports = main

更新 3

这有效!

function main () {
  return alpha() + beta() + 'gamma'
}

var alpha = main.alpha = function () {
  return 'alpha'
}

var beta = main.beta = function () {
  return 'beta'
}

module.exports = main

没有。代码就是这样。 Javascript 只做您告诉它做的事。如果您不将函数声明为 main 的 属性,那么它就不会是 main 的 属性。

您可以开发自己的文本预处理器,将所有顶级函数更改为 main 的属性 - 基本上只是更改源代码以那样声明它们。您可以使用几种不同的方法来识别正确的函数 - 从前一行的结构化注释到实际检测哪些函数声明位于顶层的代码。

不幸的是,Javascript 不提供任何方法来迭代范围内声明的所有项目。为了能够迭代它们,它们必须是对象的属性,而不仅仅是范围内的声明。因此,Javascript 不提供任何方式来迭代模块中的所有顶层函数(记住模块中的顶层实际上不是全局层,而是在模块函数范围内)。这意味着您不能迭代在您自己的范围内定义的函数 Javascript 以使用您自己的 JS 更改它。


你还没有真正解释为什么仅仅将函数声明为你想要的适当属性是一个负担。

如果你想要一行代码既使你的函数成为main的属性又定义了一个可以使用的局部符号,你可以这样做:

var alpha = main.alpha = function() {...};