【问题标题】:Universal module definition - writing style通用模块定义——写作风格
【发布时间】:2015-07-23 01:12:45
【问题描述】:

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

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

【问题讨论】:

    标签: javascript amd umd


    【解决方案1】:

    这不是和这个一模一样吗?

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

    我觉得这更容易阅读

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

    【讨论】:

    • 完全有道理,我什至没有想到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多