SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而只是实现JavaScript的模块化及按模块加载。
工厂函数factory解析
在我们自定义的js文件中,我们使用define来定义一个模块,define方法和require中的一样,第一个参数可以传递一个模块,当然也可以不写(可选),第二个参数是一个匿名函数,不同于requireJS的是seaJS的匿名函数存在三个参数,这三个参数有不同的意义,建议不要省略,并且名称也不建议修改(形参可以修改名称的嘛),下面我们来看看这三个参数的含义:
1、 require——模块加载函数,用于记载依赖模块。
2、 exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
3、 module——模块的元数据。
test02.js:
define(function(require,exports,module){ var date1 = "哈哈,我是test02.js中的变量date1,我是私有的"; //exports定义的变量是公共,在其他模块中可以调用 exports.date2 = "哈哈,我是test02.js中的变量date2,我是公共的"; var fn1 = function() { alert("哈哈,我是test02.js的函数fn1,我是私有的"); } fn1(); var fn2 = function() { alert("哈哈,我是test02.js的函数fn2,我是私有的"); } //exports定义的函数(方法)是公共,在其他模块中可以调用 exports.fn3 = function() { alert("哈哈,我是test02.js的函数fn3,我是公共的"); } }); |
test03.js:
define(function(require,exports,module){ //require用于导入所需的模块 //载入a模块,我们可能在这个文件中使用test02.js var test02 = require("test02"); alert("--------------------------------"); /** * 虽然变量也是使用exports声明的 * 但是变量的话,只有在seajs.use方法中可以调用 * 在其他模块中照样不能调用,注意!! */ alert(test02.data2); /** * 在其他模块(test03.js)中,可以调用 * test02.js中的exports声明的方法 * 方法一旦被exports声明,代表着公开 */ test02.fn3() alert("--------------------------------"); var date1 = "哈哈,我是test03.js中的变量date1,我是私有的"; //exports定义的变量是公共,在seajs.use方法中可以调用 exports.date2 = "哈哈,我是test03.js中的变量date2,我是公共的"; var fn1 = function() { alert("哈哈,我是test03.js的函数fn1,我是私有的"); } var fn2 = function() { alert("哈哈,我是test03.js的函数fn2,我是私有的"); } //exports定义的函数(方法)是公共,在其他模块中可以调用 exports.fn3 = function() { alert("哈哈,我是test03.js的函数fn3,我是公共的"); } fn1(); fn2(); }); |
页面:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript" src="js/sea.js" ></script> <script type="text/javascript"> seajs.use("test03",function(t3) { //t3.fn1();//报错,因为没有公共化 //t3.fn2();//报错,因为没有公共化 t3.fn3();//正确,因为使用了exports声明,此时这个方法公共化 //在这里可以调用使用exports声明的变量 alert(t3.date2) }); </script> </head> <body> <h1>seajs Demo</h1> </body> </html> |