Javascript 如何处理仅由一个函数使用的函数

Javascript 如何处理仅由一个函数使用的函数,javascript,function,language-agnostic,Javascript,Function,Language Agnostic,当一个函数调用一个或多个其他函数,而这些被调用的函数只被一个调用函数使用时,代码的结构应该如何 例如,如果您的funcB()和funcC()仅由funcA()调用,那么funcB()和funcC()应该是匿名函数或嵌套函数,或者如果它们是类的一部分,应该简单地声明为私有还是放在内部类中 我目前正在使用JavaScript,但在使用其他语言如C++和java时遇到了同样的情况。 据我所知,JavaScript确实有嵌套函数,尽管我从未见过使用它?如果funcB()和funcC()与funcA()一

当一个函数调用一个或多个其他函数,而这些被调用的函数只被一个调用函数使用时,代码的结构应该如何

例如,如果您的
funcB()
funcC()
仅由
funcA()
调用,那么
funcB()
funcC()
应该是匿名函数或嵌套函数,或者如果它们是类的一部分,应该简单地声明为私有还是放在内部类中

我目前正在使用JavaScript,但在使用其他语言如C++和java时遇到了同样的情况。 据我所知,JavaScript确实有嵌套函数,尽管我从未见过使用它?

如果
funcB()
funcC()
funcA()
一起在概念上没有意义,那么你就不应该公开

传统的OOP会说应该将它们设置为私有

我认为几乎总是有另一个概念属于
funcB()
funcC()
。您应该在不同的类上公开这些方法。任何持有
funcA()
的都持有该类的私有实例


在抽象地谈论a、B和C时,很难提出令人信服的理由。但我想说,如果它们在概念上不属于
funcA()
,那么它们在概念上就属于其他东西。如果你同意这个前提,并且同意组合比继承更好,那么结论就是在其他类中公开它们。

这里有很多方法

Javascript支持匿名函数,这些函数可以在代码中的任意位置定义并分配给变量

因此,你可以写:

function foo() {
  var bar = function() { /* some code */ };

  bar();
}
条码
在其他任何地方都不可用。这对于封装功能可能很有用,但我认为它不是一个非常可伸缩的开发模型

有一个学派认为,任何只调用一次的函数在将来都可能是值得多次调用的函数。在这种情况下,您可以创建“私有”函数:

var Foo = (function() {

  var Foo = function() {
    /* some constructor code */
  };

  var private = function() { /* a private function */ };

  Foo.prototype.public = function() {
    private();
    /* And some other stuff */
  };

  return Foo;

})();

var foo = new Foo();
foo.public(); /* Includes a call to the private method */
在这种情况下,您的
private
方法是真正私有的,因此您不必向外界公开内部工作

但实际上,这更多的是讨论如何实现访问修改。有很多信息可以回答这个问题。更大的设计问题是,是实现单独的函数,还是仅仅内联它们

我的选择通常是将函数的内聚片段塞进。。。嗯,转换成函数。函数调用的代价是非零的,但在事实发生之后,请担心。。。如果您确定函数调用是性能瓶颈,那么您可能会担心调用是否过多,以及是否应该重构代码以使用较少的调用


在此之前,编写函数,调用它们,并沉迷于清晰的代码。只要确保使用好的方法名称:)

当我开始一个项目时,我倾向于在事情变得稳定之前避免封装功能


正如Dancrumb指出的,函数调用不是免费的,因此您可能需要进行一些小的重构。但是当你看到几个月没碰过的代码时,这个干净的组织会对你的心理健康有好处。当你在一个团队中工作时,这是指数级的:)

如果funcB和funcC被创建为类内的闭包,并且你没有将它们“公开”给接口,那么它们可以更改(被删除、添加、返回不同的值等等),而不必担心它们在类外是如何实现的

一旦他们暴露出来,所有的赌注都被取消,他们可能需要进行单元测试、支持等等。这是一条众所周知的规则

闭包只是在将要使用闭包的范围内声明的函数

方法A

function MyClass(){

    function funcA(i){
        funcB(i);
        funcC(i);
    }
    function funcB(i){
        //...
    }
    function funcC(i){
        //...
    }
    return {funcA:funcA}
}
va mc = new MyClass()
for(var i = 0;i<100000;i++){    
    mc.funcA(i);
}
函数MyClass(){
函数funcA(i){
B(一);
funcC(一);
}
函数funcB(i){
//...
}
函数funcC(i){
//...
}
返回{funcA:funcA}
}
va mc=新的MyClass()

对于(var i=0;i
javascript!=private members
?您的意思是这样的吗?
function MyClass(){
    function funcA(){
        function funcB(){
        }
        function funcC(){
        }
        for(var i = 0;i<100000;i++){
            funcB();
            funcC();
        }
        // funcB, funcC are created before and then released after this
    }
    return {funcA:funcA}
}
va mc = new MyClass()
mc.funcA();