我起初花了很长时间才理解这种模式,我认为这主要是因为它的编写方式:
(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语句,但我发现这更容易阅读。我在这里错过了什么吗?是否有充分的理由使用第一种方法?
答案 0 :(得分:2)
这与此完全相同吗?
不完全 - 那些root
和factory
变量现在在模块定义的范围内,它是一个更深层次的闭包级别。而且这有一个严重的缺点,即factory
不能(通常)被垃圾收集,而在第一种模式中,它实际上是匿名的。
我发现这更容易阅读
我不同意。 AMD和UMD解决了使用工厂调用的单个“定义”包装器 - 其中工厂函数的内容是有趣的(文件的“主要”内容),定义调用只不过是标题。当标题缩小并且只占一行时,这变得尤为明显 相比之下,在提议的替代方案中,模块隐藏在IEFE的某个深处 - 它甚至需要比正常情况缩进一层。