js漫谈
不久前在武汉这边找到了自己的第一份软件方面工作,当时还很欢喜,可惜最后因为家里的事情,公司的情况等等,最近又成了待业状态,正好安静的考虑一下以后怎么走,是考研还是继续找工作,非计算机专业学生自学找软件方面的工作真心困难。
说了几句闲话,算是甩一甩心中的闷气。写这篇随笔算是为了复习一下js,也是呼应自己很久之前写的那篇漫话js的随笔。在html中,加载js文件的方式一般有两种,一种是以<script src="~/Scripts/xx.js" type ="text/javascript"></script>的标签的方式引入,另外一种就是以eval("xx")的方式执行。dojo1.6之前的加载方式使用的ajax+eval的方式来实现按需加载,之后遵循AMD范式,以html页中动态的添加script标签,同时配合加载完成事件来实现js模块的按需加载。二者最大的区别在于作用域,script标签中的js代码作用于顶级域,里面定义的函数和变量全局可见,而eval作用于执行域(w3c标准,各浏览器虽有差异但基本遵循)。根据某些测试(出自一篇介绍AMD文章,出处已经遗忘,期待补充),使用script方式的效率可以比eval高出20%-30%,而且script标签的方式可以享受浏览器的各种功能。所以现在主要框架使用的异步加载方式一般也是script标签的方式。
说完了方式,就是同步与异步的问题了。就我目前处理过的一些网页实例来说,异步的需求很少,毕竟没有多少经验,所以我也不好怎么说它的具体的适用范围是什么,只能说他适用于需求高度差异化的情景。目前还是同步的方式较多,即所有的js需求文件都写死在html文件中,jquery应该就属于这一类,它的各个模块高度内聚的放在一个文件中,然后使用(function(){})()的方式来世显现最小接口暴露和避免接口污染,不过使用闭包要当心内存占用的副作用,不必要的变量不要置放于闭包域中。哦,这里想说的是,ajax+eval也可以实现同步加载,只要将ajax的请求方式改为同步就行。
最后是实现方式,pt标签的异步加载方式,核心有两个,一个是登记表,即文件加载状态、模块加载状态与文件与模块之间的关系登记,使用一个简单的模拟二维表就可以实现,另外一个就是onload/onreadystate事件的回调处理,这类代码园子里面已经很多,我就不贴了。