Javascript:私有函数的嵌套-好还是坏?

Javascript:私有函数的嵌套-好还是坏?,javascript,function,nested,Javascript,Function,Nested,我经常使用这种结构: var example = (function () { function privateFn2 () { ... } function privateFn1 () { ... } return { publicMethod1: function () {... }, publicMethod2: function () {... }

我经常使用这种结构:

var example = (function () {
    function privateFn2 () {
       ...
    }
    function privateFn1 () {
       ...
    }
    return {
        publicMethod1: function () {...
        },
        publicMethod2: function () {...
        }
    };
}());
我想知道的是:如果privateFn1是唯一调用privateFn2的函数/方法,那么按照如下方式设置它是否被认为是更好的做法

为清晰起见进行了编辑

var example = (function () {
    function privateFn1() {
        function privateFn2() {
        }
        ...
        privateFn2();
    }
    return {
        publicMethod1: function () {...
        },
        publicMethod2: function () {...
        }
    };
}());
当然,这是一个非常简单的例子。问题是我有很多私有函数,我想知道嵌套是否受到重视。我承认这很可能是一个偏好的问题,但任何建议都将得到感激


谢谢。

我不想再举第二个例子了。每次调用
privateFn1
时,它都会重新定义
privateFn2
。为什么不做一次呢?以后你甚至可能需要在其他地方使用它

但是,如果您真的想隐藏
privateFn2
,更好的解决方案是:

var privateFn1 = (function () {
    function privateFn2() {
        // ...
    }

    return function () {
        privateFn2();
        // ...
    };
})();

这要视情况而定。如果您有几个只与另一个私有函数相关的私有函数,那么可能在这种情况下,对象或类正在打包更多的功能

这里有一些问题要问:

  • 这些私人功能有副作用吗?也就是说,是吗 操纵任何封闭属性?如果不是,这是某种广义的吗 可以静态实现并包含的逻辑 分别地或者,这些私有函数是在处理 可以移动到其他类或对象的属性
  • 私有函数是否是要在中使用的简单任务特定的辅助函数 较大的算法或控制功能;例如,用于对数据进行排序的筛选函数 数组,还是其他类型的迭代回调?如果是这样,那么事实上可能是这样 cleaner将这些函数嵌套在内部,并使它们不在main的范围内 对象其他代码是否需要这些函数
  • 主私有函数将被调用多少次?如果它将被称为非常 频繁地(在循环内或在计时器间隔上),然后嵌套 内部的私有函数可能会产生可测量的开销-- 如果没有私人功能,这一点本来可以忽略不计 我只是偶尔接到电话

总而言之,考虑这些问题会帮助你决定什么是对你的特定情况最好的。

我明白你在说什么,但是你不会返回相同的东西。我已经编辑了我的意思使它更清晰。我很确定这是一样的:)出于好奇,为什么要混合函数声明样式?而且,在我看来,这样嵌套私有函数是没有意义的。把他们分开。我知道您在另一个函数中看不到
privateFn2
的任何用途,但如果您将其置于
privateFn1
之外,则其工作原理相同。它还避免了重新声明
privateFn2
。此外,请将
privateFn2
的内容放在
privateFn1
中,或者将
privateFn2
放在与
privateFn1
相同的范围内。谢谢,@TylerCrompton。在回答您的问题时,我想我混合了函数声明样式,因为(1)在我的例子中,使用私有方法而不是函数通常没有好处,因为我没有使用
this
,因此调用函数更整洁(并且最小化),和(2)
var示例=(…())最终成为一个有方法的对象-我想您已经意识到;)在代码的第二部分中,我省略了外部结构,但为了清晰起见,我对其进行了编辑。它已经被
var示例
模式隐藏了:)谢谢:)它们通常是“特定于任务的助手函数”,顺便说一句。