【问题标题】:Global helper functions and exported function全局辅助函数和导出函数
【发布时间】:2016-03-14 04:09:12
【问题描述】:
我写了一个 node.js 模块,它有一个 main 函数和两个辅助函数,我只导出了 main 函数,我的问题是:是否可以像全局函数一样保留两个辅助函数,或者我可以找到一个更好的方法?
function myFirstHelper(args) {
// ...
return result;
}
function mySecondHelper(args) {
// ...
return result;
}
module.exports = function main(args) {
// ...
return result;
};
【问题讨论】:
标签:
javascript
node.js
architecture
module
【解决方案1】:
你可以使用嵌套函数:
module.exports = function main(args) {
function myFirstHelper() {
// ...
return result;
}
function mySecondHelper() {
// ...
return result;
}
// ...
return result;
};
... 并且不需要传递args,因为这些嵌套函数可以访问它。然而,除非您的模块非常大,否则没有理由担心这一点。
只有在可见性/范围远大于其适用性时,某事物的可见性/范围才会出现问题。
例如,在大型函数顶部声明的变量如果在最顶部声明/定义但仅由底部的 3 行代码使用,则可能是一个触发点和混淆和维护问题的根源.在这种情况下,变量的可见性远大于其适用性,因此读者在跟踪函数的时间比实际使用的时间长得多时必须考虑到这一点,从而增加了智力开销。当然,海量函数也往往是一种气味,但那是另一回事。
所以在这里你有在模块中可见的功能。如果模块很小并且主要由使用这些函数的代码组成,那么这些函数的可见性/范围不会比它们在模块中的适用性/使用范围更广。
也就是说,如果您以前没有遇到过嵌套函数,即使出于纯粹的组织目的,它们也很方便,而且正是因为它们可以让您避免污染外部作用域。因此,在这种情况下,它们可能是一个方便的选择。但是不要太担心函数(或任何东西)的范围已经很窄了。
【解决方案2】:
我认为您不必担心其他模块的范围。
不过我理解你的感受。如果您想保持清洁,可以使用Self invoking function,如下所示。
你知道,即使在 nodejs 之外,你也可以在所有 javascript 环境中使用这种模式。
(function(){
function myFirstHelper(args) {
// ...
return result;
}
function mySecondHelper(args) {
// ...
return result;
}
exports.main = function(args) {
// ...
return result;
};
})();