通用模块定义——书写风格

Universal module definition - writing style

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

(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 语句,但我发现它更容易阅读。我在这里错过了什么吗?使用第一种方法有充分的理由吗?

Isn't that the exact same thing as this?

完全 - 那些rootfactory变量现在在模块定义的范围内,它是一个更深的闭包级别。这有一个严重的缺点,即 factory 不能(平凡地)成为 garbage-collected,而在第一个模式中它确实是匿名的。

I find this much easier to read

我不同意。 AMD 和 UMD 围绕一个用工厂调用的 "define" 包装器解决 - 其中工厂函数的内容是有趣的内容(文件的 "main" 内容)并且定义调用仅此而已但是 header。当 header 被缩小并且只占用一行时,这一点变得尤为明显。
相比之下,在提议的替代方案中,模块隐藏在 IEFE 深处的某个地方——它甚至需要比正常情况下多缩进一层。