我一直在阅读dojo 1.7加载器如何使用AMD API /框架here和here too,我在其中一张幻灯片上看到了这句话:“AMD(s)最棒正如一些人可能认为的那样,好处是无法按需加载脚本,最大的好处是代码组织/模块化的增加以及对全局/命名空间的需求减少。“但我的问题是,使用普通的js函数不能避免全局变量,如果你需要访问另一个函数的执行上下文(和另一个函数的'私有'变量),可能还有dojo.hitch()吗?换句话说,除了异步加载你需要的东西之外,AMD框架的好处是什么?
答案 0 :(得分:9)
AMD的好处是拥有模块系统的好处,类似于其他语言的命名空间系统。在JavaScript中,我们经常使用全局变量伪造它,但模块提供了许多特定的好处:
这些模块提供其顶级范围的隐私,用于从其他模块导入单例对象以及导出自己的API的工具。
---来自CommonJS Modules/1.1.1 spec,它开始了所有。
这里的关键是进出口设施。以前每个人都在使用全局变量(例如window.jQuery
,window._
等)进行临时制作。要获得jQuery的导出功能,你必须知道这个神奇的名字,希望没有人与它发生冲突,并确保在你的脚本之前加载了jQuery脚本。没有办法声明性地指定你对jQuery的依赖,并且除了将它们填充到全局window.jQuery
对象之外,jQuery没有办法说“这就是我导出的东西”。
模块格式修复了这个问题:每个模块都会导出特定的功能,例如
// math.js
define(function (require, exports, module) {
exports.add = function (a, b) { return a + b; };
});
并且每个模块可能需要特定的其他模块,例如
// perimeter.js
define(function (require, exports, module) {
var math = require("math");
exports.square = function (side) {
return math.add(math.add(side, side), math.add(side, side));
};
});
为什么AMD应该成为首选的模块系统,詹姆斯·伯克,RequireJS的作者---一个像Dojo一样的AMD加载器---写了a blog post detailing why he thinks AMD is the best。