11

我经常使用这种结构:

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 () {...
        }
    };
}());

当然,这是一个非常简化的示例。问题是我有很多私有函数,我想知道嵌套是否受到好评。我承认这很可能是一个偏好问题,但我们将不胜感激地接受任何建议。

谢谢。

4

2 回答 2

7

这取决于实际情况。如果您有几个仅与另一个私有函数相关的私有函数,那么这可能是对象或类打包了更多功能的情况。

这里有一些问题要问:

  • 这些私有函数有副作用吗?也就是说,他们是否在操纵任何封闭的属性?如果不是,这是一些可以静态实现并单独包含的通用逻辑吗?或者,这些私有函数是否在操作可以移动到另一个类或对象的属性子集?
  • 在更大的算法或控制函数中使用私有函数是简单的任务特定的辅助函数吗?例如用于对数组进行排序的过滤器函数,或其他类型的迭代回调?如果是这样,那么将这些函数嵌套在内部并将它们排除在主对象的范围之外实际上可能更干净。任何其他代码都需要这些功能吗?
  • 主私有函数会被调用多少次?如果它会被非常频繁地调用(在循环内或在计时器间隔内),那么将私有函数嵌套在内部可能会产生可衡量的开销——如果私有函数只是偶尔被调用,这将可以忽略不计。

总是需要权衡取舍,考虑这些问题将帮助您确定最适合您的特定情况的方法。

于 2012-08-08T22:24:03.573 回答
3

我会避免你的第二个例子。每次privateFn1被调用时,它都会重新定义privateFn2. 为什么不只做一次?您甚至可能需要稍后在其他地方使用它。

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

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

    return function () {
        privateFn2();
        // ...
    };
})();
于 2012-08-08T21:39:39.737 回答