Javascript 节点';s模块。导出和iLife混淆

Javascript 节点';s模块。导出和iLife混淆,javascript,node.js,iife,Javascript,Node.js,Iife,我一直在玩node和Javascript iLife,我对node的模块、导出和iLife在Javascript中的工作方式有点困惑 (function (Calculator) { var calculator = function () { var currentValue = 0, add = function (num) { return currentValue += num; }

我一直在玩node和Javascript iLife,我对node的模块、导出和iLife在Javascript中的工作方式有点困惑

(function (Calculator) {
    var calculator = function () {
        var currentValue = 0,

            add = function (num) {
                return currentValue += num;
            };

        return {
            current: currentValue,
            add: add
        };
    }();

    module.exports = calculator;
}(module.exports));
当我使用行module.exports=calculator时,上面的代码导致我的测试通过导出模块

为什么当我使用参数Calculator=Calculator(注意案例)时会导致我的测试全部失败

我想,计算器(参数)指的是模块。导出(传入的值

简言之:

计算器=计算器;//不工作


module.exports=calculator;//确实有效

我认为这很有趣,所以我要添加它。@dandavis说它们是一样的,这是对的。但我刚刚发现,通过使用它,您可以从传入的值更改全局值。下面确实将
calculator
作为全局
module.exports
的值。 至少在我玩的这个
gulp
东西上是这样。不过我不是节点专家,所以在真正的节点服务器领域可能会有所不同

(function (Calculator) {
    var calculator = function() {
        var currentValue = 0,

            add = function(num) {
                return currentValue += num;
            };

        return {
            current: currentValue,
            add: add
        };
    }();

    Calculator.exports = calculator;

})(module);

它们确实==相同的值,但名称不同,因此将值重新分配给本地名称对全局名称没有任何影响。module.exports对象由模块创建system@dandavis:这是一个答案,不是注释。:-(但没有“全局”计算器))我通常在注释中用英语,在答案中用格式JS(如果存在强烈需求)。