通用模块定义 - 写作风格

时间:2015-07-23 01:12:45

标签: javascript amd umd

我起初花了很长时间才理解这种模式,我认为这主要是因为它的编写方式:

(function(root, factory) {
    // Export MyModule depending on the environment
    if (typeof define === "function" && define.amd) {
        define("MyModule", [], factory);
    } else {
        root.MyModule = factory();
    }
}(this, function() {
    return { 
        // Module definition
    };
}));

这不是一回事吗?

(function(root) {
    var factory = function() {
        return { 
            // Module definition
        };
    };
    // Export MyModule depending on the environment
    if (typeof define === "function" && define.amd) {
        define("MyModule", [], factory);
    } else {
        root.MyModule = factory();
    }
}(this));

现在有一个var语句,但我发现这更容易阅读。我在这里错过了什么吗?是否有充分的理由使用第一种方法?

1 个答案:

答案 0 :(得分:2)

  

这与此完全相同吗?

完全 - 那些rootfactory变量现在在模块定义的范围内,它是一个更深层次的闭包级别。而且这有一个严重的缺点,即factory不能(通常)被垃圾收集,而在第一种模式中,它实际上是匿名的。

  

我发现这更容易阅读

我不同意。 AMD和UMD解决了使用工厂调用的单个“定义”包装器 - 其中工厂函数的内容是有趣的(文件的“主要”内容),定义调用只不过是标题。当标题缩小并且只占一行时,这变得尤为明显 相比之下,在提议的替代方案中,模块隐藏在IEFE的某个深处 - 它甚至需要比正常情况缩进一层。