当然我这里略了很多,你看它,无非就是一个闭包,传入了window和jQuery本身,然后再绑定到window上,这样,我们就只能访问到暴露出来的$以及$上的方法和属性,我们根本无法修改内部的数据 。
OK,到了这个阶段,其实算是一个转折点,我们有了初步的法律,还需要后续针对法律的完善,
二、法律的初现与CommonJs随着社会的发展,出现一种规则已成必然,于是commonJs统领举起模块化的大旗,让JavaScript迈向了另一个阶段 。commonJs最初由 JavaScript
社区中的 Mozilla
的工程师Kevin Dangoor
在Google Groups中创建了一个ServerJs小组 。该组织的目标是为web服务器、桌面和命令行应用程序以及浏览器构建JavaScript生态系统 。嗯,它的野心很大~,后来,他就就把ServerJs改成了commonJs,毕竟ServerJs的范围有点小,commonJs更符合他们的初衷 。
而后,在同一年的年底,NodeJs出现了,Javascript不仅仅可以用于浏览器,在服务器端也开始攻城略地 。NodeJs的初衷是基于commonJs社区的模块化规范,但是NodeJs并没有完全遵循于社区的一些腐朽过时的约束,它实现了自己的想法 。
commonJs规范的写法,如果大家写过NodeJs一定都有所了解,大概是这样的:
// a.jsmodule.exports = 'zaking'// b.jsconst a = require("./a");console.log(a); // zaking看起来挺简单的,但是这里隐藏了一些不那么容易被理解的特性 。
在NodeJs中,一个文件就是一个模块,有自己的作用域,在一个文件里面定义的函数、对象都是私有的,对其他文件不可见 。并且,当第一次加载某个模块的时候,NodeJ会缓存该模块,待再次加载的时候,会直接从模块中取出module.exports属性返回 。比如:
// a.jsvar name = "zaking";exports.name = name;// b.jsvar a = require("./a.js");console.log(a.name); // zakinga.name = "xiaoba";var b = require("./a.js");console.log(b.name); // xiaoba诶?为啥你写的是“exports.”,不是module.exports?NodeJs在实现CommonJs规范的时候为了方便,给每个模块都提供了一个exports私有变量,指向module.exports 。有一点要尤其注意,exports
是模块内的私有局部变量,它只是指向了 module.exports
,所以直接对 exports
赋值是无效的,这样只是让 exports
不再指向 module.exports
了而已 。
我们回到上面的代码,按理来说,我第二次引入的b的name应该是“zaking”啊 。但是实际上,在第一次引入之后的引入,并不会再次执行模块的内容,只是返回了缓存的结果 。
另外一个核心的点是,我们导入的是导出值的拷贝,也就是说一旦引入之后,模块内部关于该值的变化并不会被影响 。
// a.jsvar name = "zaking";function changeName() {name = "xiaowangba";}exports.name = name;exports.changeName = changeName;// b.jsvar a = require("./a.js");console.log(a.name); // zakinga.changeName();console.log(a.name); // zaking嗯,一切看起来都很不错 。
三、争奇斗艳,百家争鸣在上一小节,我们简单介绍了模块化的始祖也就是CommonJs以及实现了该规范的NodeJs的一些核心内容 。但是NodeJs的实现的一个关键的点是,它在读取或者说加载模块的时候是同步的,这在服务器没什么问题,但是对于浏览器来说,这个问题就很严重,因为大量的同步模块加载意味着大量的白屏等待时间 。
基于这样的问题,从CommonJs中独立出了AMD规范 。
1、AMD规范与RequireJsAMD,即Asynchronous Module Definition,翻译过来就是异步模块化规范,它的主要目的就是解决CommonJs不能在浏览器中使用的问题 。但是RequireJs在实现上,希望可以通吃,也就是可以在任何宿主环境下使用 。
经验总结扩展阅读
- 条件期望:Conditional Expectation 举例详解之入门之入门之草履虫都说听懂了
- 分布式存储系统之Ceph集群存储池操作
- 0的概念是什么
- 咸鱼之王赌狗控制流阵容怎么玩
- 明日之后玻璃窗在哪里买
- 明日之后网易云课堂有什么用
- 我的电脑不显示磁盘
- 挽救爱情的方法
- 如何准备跑步比赛
- 欲加之罪何患无辞下一句