我们的网站所使用的myScript就遇到了这么一个问题。因为有些组件是不需要一次获取的,当然,我们可以在要使用这分块出的函数的地方再引入一次就好了,不过这样还是麻烦了,我们考虑到这一点决定在调用时动态加载,我们考虑把原有函数拿到单独的一个文件中去定义一个已“_”开头的函数,然后在myScript.js中的原来的函数(下文称做外层包装函数)定义修改为判断对应的函数是否存在,存在则直接调用,不存在则先加载,待onload后再调用。
当然首先要解决的问题还是在于如何确保分块出来的脚本先加载以便能返回正确的值呢?这是一个非常麻烦的问题。我们知道,js是异步加载的,由于我们外层包装函数还在运行,此时,浏览器是不会加载我们刚刚引入的脚本。我们尝试使用sleep之类的函数却发现js根本就不支持,如果非要这样做的话,好像只能写个死循环,这样完全达不到我们要的效果还占用大量CPU。被某些人吹到天上去了的不阻塞在这个时候简直磨死人了!当然,还有一种方式——使用回调函数,但至少我个人觉得这是影响美观的,更重要的是这样的修改会使得我前面的调用完全失效。我仔细思考之后,终于有了一个折中的方案——我们返回值是一个对象,并且我们并不马上使用这个返回值。我们知道,js的对象是引用传递,这就给我们了一个方案。我们先返回一个空对象(马甲对象),由于这个对象在短时间内不会被使用(在某些事件 如onclick 中使用,实际上主函数也会很快退出以便加载脚本),而一般来说,加载这个模块不需要太长的时间。待加载完成后,在把真实对象的属性赋值到马甲对象上,这样,外部就可以通过马甲对象来操作真实对象了。
不过也有是返回字符串的和需要立刻使用那就还没想到好的方法,只好使用回调函数的方案了。