Answers:
我通常支持嵌套函数,尤其是在JavaScript中。
我认为,很多程序员要么是C / C ++ / Java的传统,就是由其他程序员所教,这一事实引起了很多反对。嵌套函数看起来不太自然,因为我们在学习编程时没有太多接触它们。这并不意味着它们没有用。
由于多种原因,您应该将其置于全球范围内。
将辅助函数嵌套到调用方中会增加调用方的长度。函数长度几乎总是一个负指标;简短的函数更易于理解,记忆,调试和维护。
如果辅助函数的名称合理,则只需读取该名称即可,而无需查看附近的定义。如果确实需要查看帮助程序定义以了解调用程序功能,则该调用程序执行的过多或正在同时处理太多的抽象级别。
如果使助手全局可用,则使该助手全局可用会允许其他函数调用它。如果没有可用的帮助程序,则很容易将其剪切和粘贴,或者忘记并重新实现,效果很差,或者使另一个功能的执行时间超出了必需的时间。
嵌套辅助函数会增加在没有声明的情况下使用调用方作用域中的变量的诱惑,因此不清楚辅助函数的输入和输出是什么。如果某个功能没有明确说明其操作的数据以及其产生的影响,则通常表明职责不明确。将帮助程序屁股声明为独立函数会迫使您知道其实际功能。
编辑
事实证明,这是一个比我想象的更具争议性的问题。澄清:
在JavaScript中,大文件扩展功能通常扮演类的角色,因为该语言不提供任何其他范围限制机制。当然,辅助函数应该放在此类准类内部,而不是外部类。
而且,关于重用更容易的前提是,假设子例程的确得到了更广泛的使用,则您愿意将其完全移出原处并将其放置在适当的位置,例如字符串实用程序库或放入全局配置注册表中。如果您不想像这样对代码进行排序,那么您最好嵌套该子例程,就像使用普通的“ 方法对象 ”以更具“阻塞性”的语言进行操作一样。
我将提出第三条路径,将两个函数都放在一个闭包中。它看起来像:
var functionA = (function(){
function functionB() {
// do stuff...
}
function functionA() {
// do stuff...
functionB();
// do stuff...
}
return functionA;
})();
我们通过将两个函数的声明包装在IIFE中来创建闭包。IIFE的返回值是公共函数,存储在函数名称的变量中。可以用与声明为全局函数(即)完全相同的方式调用public函数functionA()
。请注意,返回值是function,而不是对该函数的调用,因此最后没有paren。
通过像这样将两个函数包装起来,functionB
现在是完全私有的,并且不能在闭包外部访问,而仅对可见functionA
。它不弄乱全局命名空间,而不是混乱的定义functionA
。