一: define
,
全局函数,用来定义模块。
参数:
1.id 模块标识(可省略)
2.deps模块依赖(比如jquery)(可省略)
3.factory:可能是:
(1)对象
(2)字符串
①和②通常表示模块的接口
(3)函数:表示模块的构造方法,执行该构造方法,可以获取该模块向外提供的接口。
factory为函数的情况,在执行时,会默认传入三个参数:
①require是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口
②exports
③module
二:require
,
require是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口,同步往下执行
三:require.async
异步回调执行,用来加载可延迟异步加载的模块,参数有两个:id和callback
require.async
方法用来在模块内部异步加载模块,并在加载完成后执行指定回调。callback
参数可选。
四:exports
,
exports
是一个对象,用来向外提供模块接口,exports
对象增加成员,还可以使用 return
直接向外提供接口
给exports对象增加成员,
(1)define(function(require) {
// 通过 return 直接提供接口
return {
foo: ‘bar‘,
doSomething: function() {}
};
(2)define(function(require, exports, module) {
// 正确写法
module.exports = {
foo: ‘bar‘,
doSomething: function() {}
};
});
});
五:module.exports:
当前模块对外提供的接口。
传给 factory
构造方法的 exports
参数是 module.exports
对象的一个引用。只通过 exports
参数来提供接口,有时无法满足开发者的所有需求。 比如当模块的接口是某个类的实例时,需要通过module.exports
来实现,
define(function(require, exports, module) { // exports 是 module.exports 的一个引用 console.log(module.exports === exports); // true // 重新给 module.exports 赋值 module.exports = new SomeClass(); // exports 不再等于 module.exports console.log(module.exports === exports); // false });
对 module.exports
的赋值需要同步执行,不能放在回调函数里,如下面这种方法就是错误的:
define(function(require, exports, module) { // 错误用法 setTimeout(function() { module.exports = { a: "hello" }; }, 0); });