通用模块定义——书写风格
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?
不完全 - 那些root
和factory
变量现在在模块定义的范围内,它是一个更深的闭包级别。这有一个严重的缺点,即 factory
不能(平凡地)成为 garbage-collected,而在第一个模式中它确实是匿名的。
I find this much easier to read
我不同意。 AMD 和 UMD 围绕一个用工厂调用的 "define" 包装器解决 - 其中工厂函数的内容是有趣的内容(文件的 "main" 内容)并且定义调用仅此而已但是 header。当 header 被缩小并且只占用一行时,这一点变得尤为明显。
相比之下,在提议的替代方案中,模块隐藏在 IEFE 深处的某个地方——它甚至需要比正常情况下多缩进一层。
起初我花了很长时间才理解这个模式,我认为主要是因为它的写法:
(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?
不完全 - 那些root
和factory
变量现在在模块定义的范围内,它是一个更深的闭包级别。这有一个严重的缺点,即 factory
不能(平凡地)成为 garbage-collected,而在第一个模式中它确实是匿名的。
I find this much easier to read
我不同意。 AMD 和 UMD 围绕一个用工厂调用的 "define" 包装器解决 - 其中工厂函数的内容是有趣的内容(文件的 "main" 内容)并且定义调用仅此而已但是 header。当 header 被缩小并且只占用一行时,这一点变得尤为明显。
相比之下,在提议的替代方案中,模块隐藏在 IEFE 深处的某个地方——它甚至需要比正常情况下多缩进一层。