PhoneGap源码分析3——require和define

先看源码:

 1 // file: lib/scripts/require.js
 2 var require,//导入函数,导入cordova库的内部已经注册的模块,第一次导入时,先创建模块
 3     define; //注册函数,注册cordova的内部模块
 4 
 5 // 通过一个立即调用的匿名函数,给require和define赋值
 6 (function () {
 7     var modules = {};    // 缓存所有的模块,初始化为一个空对象
 8 
 9     function build(module) {//内部私有函数
10         var factory = module.factory;
11         module.exports = {};
12         delete module.factory;  // 第一次导入时根据模块提供的工厂构建,然后删除这个工厂,后续直接获取构建的结果
13         factory(require, module.exports, module);
14         return module.exports;
15     }
16 
17     require = function (id) {//导入模块,若模块不存在,抛出异常
18         if (!modules[id]) {
19             throw "module " + id + " not found";
20         }
21         return modules[id].factory ? build(modules[id]) : modules[id].exports;
22     };
23 
24     define = function (id, factory) {//定义模块,模块名称和构建模块的工厂方法
25         if (modules[id]) {
26             throw "module " + id + " already defined";
27         }
28         modules[id] = {
29             id: id,
30             factory: factory
31         };
32     };
33 
34     define.remove = function (id) {//移除模块
35         delete modules[id];
36     };
37 
38 })();

1、首先在外部cordova环境中定义require和define两个变量,用来存储实现导入功能的函数和实现注册功能的函数。
2、然后用一个立即调用的匿名函数来实例化这两个变量,在这个匿名函数内部,缓存了所有的功能模块。

3、注册模块时,如果已经注册了,就直接抛出异常,防止无意中重定义,如确实需要重定义,可先调用define.remove。

4、从内部私有函数build中,可以看出,调用工厂函数时,提供了三个实参,require、module.exports、module,因此,在各个模块中定义的工厂函数,也相应的可以使用三个参数,最好就是如源代码中那样,使用三个命名参数来接受,当然,也可以直接使用arguments。

转载于:https://www.cnblogs.com/linjisong/archive/2012/08/08/2628479.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值