2

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

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

4

1 回答 1

2

这不和这个完全一样吗?

完全是——这些rootfactory变量现在在模块定义的范围内,它是更深一层的闭包。这有一个严重的缺点,factory不能(微不足道地)再被垃圾收集,而在第一个模式中它真的是匿名的。

我发现这更容易阅读

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

于 2015-07-23T01:56:53.517 回答