这两天,没什么太多的事情,好吧,我承认,是我这两天不想做公司的项目,因为我突发奇想,其实也不算突发奇想,算是对以前的想法的实现,就是把JS当做Java来写。
现在也有很多JS动态加载的框架,比如In.js。但是这种并不是我想要的编写方式,我来说说我的想法。
先来一段java代码
代码如下 | 复制代码 |
import Biz.User; User u = new User(); u.show(); |
按流程就是导包、实例化、调用。
JS是做不了导包的,或者说代码意义上的导包,一般只是在页面上进行script标签的引入。
那么 先假设需要写成这样
代码如下 | 复制代码 |
Using("User"); var u = new User(); u.show(); |
那么,在JS里面可以实现吗?
来一句一句的分析,当然,前提是页面并不用script标签载入user.js,不然就没意义了。
第一句
Using("User");为什么用Using,当然只是我的一个命名想法而已,可以联想一下C#,用的就是using,借来而已。
Using里面写入的当然是我需要的对象User,顾名思义,我当然写成Using("User")了。先不说内里是怎么实现的,起码思路是这样。
因为不能模拟关键字写成 Using User;这种起码我是做不到了。
第二句和第三句
代码如下 | 复制代码 |
var u = new User(); u.show(); |
很正常,就是很平常的实例化与函数调用,唯一不解的是User对象哪里来的?那么当然是第一句导包的时候导入的。
流程就是这么个流程,那么到底能不能实现,关键就在第一句话。也就是说,到底能不能导包成功,而且该怎么导包。
从script标签吸引灵感,对,异步加载所需要的js文件。
也就是说
代码如下 | 复制代码 |
Using("User"); |
相当于写了一句
代码如下 | 复制代码 |
<script type="text/javascript" src="user.js"></script> |
现在这么看下来,这么做有意义吗?就为把script标签写成JS动态引入的?或者,只为少写几个字符?
当然不能,这么做毫无意义!那要怎么做?
先从效率来讲。
如果一个页面需要载入N多js文件的时候,如下
代码如下 | 复制代码 |
<script type="text/javascript" src="jquery.min.js"></script> <script type="text/javascript" src="view.js"></script> <script type="text/javascript" src="register.js"></script> <script type="text/javascript" src="validate.js"></script> <script type="text/javascript" src="user.js"></script> <script type="text/javascript" src="order.js"></script> <script type="text/javascript" src="type.js"></script> |
等等等等。
是不是很吓人,那是相当吓人,而且后期维护需要很高的成本,有多少页面,可能就需要修改几个页面。那么,当页面只引入关键的几个js文件,其他文件都采用动态载入的方式呢?
比如我们只需要载入jquery文件,然后调用
代码如下 | 复制代码 |
$.getScript("user.js",function(){}); |
这样,我们就做到页面文件里面只需要引入
代码如下 | 复制代码 |
<script type="text/javascript" src="jquery.min.js"></script> |
即可。
那么这种写法的坏处在哪里?看一段代码
代码如下 | 复制代码 |
$.getScript("user.js",function(){ $.getScript("order.js",function(){ $.getScript("type.js",function(){ $.getScript("validate.js",function(){ // and so on.. }); }); }); }); |
PS:用In.js的watch函数是可以避免这种情况产生的。这不在本博文的考虑范围了。
花眼吗?还愿意去对齐代码吗?即便有格式化工具,你还愿意将闭合括号与哪个$.getScript对应吗?当然不愿意。
那么,仿java的导包形式应声而出。
代码如下 | 复制代码 |
Using("User"); Using("Order"); Using("Type"); Using("Validate"); // and so on.. |
或者你愿意,你可以
代码如下 | 复制代码 |
Using("User","Type","Order","Validate",...); |
写法问题 无所谓。当然我推荐使用第一种方法,清晰。
导包之后,所有的用法不需要任何嵌套,正常使用。
代码如下 | 复制代码 |
var u = new User(); var o = new Order(); // and so on..但是会提出一个问题。假如异步的加载都在Using("XXX")的时候执行,那么 Using("User"); |
首页 1 2 3 4 末页