JavaScript AJAX之惰性载入函数


Posted in Javascript onAugust 27, 2014

在JS中有些内存只需执行一遍即可,如浏览器类型检测是最常用的一个功能,因为我们使用Ajax的时候需要检测浏览器的内置的XHR。我们可以在第一次检测的时候记录下类型,往后在使用Ajax的时候就不需要再去检测浏览器类型了。在JS中就算只有一个if也总比没有if的语句效率要高。

普通Ajax方法

/**

 * JS惰性函数

 */

 

function ajax(){

    if(typeof XMLHttpRequest != "undefined"){

        return new XMLHttpRequest();    

    }else if(typeof ActiveXObject != "undefined"){

        if(typeof arguments.callee.activeXString != "string"){

            var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];    

 

            for(var i=0,k=version.length;i<k;i++){

                try{

                    new ActiveXObject(versions[i]); 

                    arguments.callee.activeXString = versions[i];

                    break;

                }catch(ex){

                    throw ex;   

                }

            }

        }   

 

        return new ActiveXObject(arguments.callee.activeXString);

    }else{

        throw "No XHR object";  

    }

}

每次调用ajax()函数都要对浏览器内置的XHR检查,效率不高。

使用惰性方式的方法

/**

 * JS惰性函数

 */

 

function ajax(){

    if(typeof XMLHttpRequest != "undefined"){

        ajax = function(){

            return new XMLHttpRequest();    

        };

    }else if(typeof ActiveXObject != "undefined"){

        ajax = function(){

            if(typeof arguments.callee.activeXString != "string"){

                var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];    

 

                for(var i=0,k=version.length;i<k;i++){

                    try{

                        var xhr = new ActiveXObject(versions[i]);   

                        arguments.callee.activeXString = versions[i];

                        return xhr;

                    }catch(ex){

                        throw ex;   

                    }

                }

            }   

 

            return new ActiveXObject(arguments.callee.activeXString);

        }

    }else{

        ajax = function(){

            throw "No XHR object";  

        }

    }

 

    return ajax();

}

在第二个惰性方法中if的每个分支都会为ajax()变量赋值,有效覆盖了原有函数,最后一步调用新的函数。下一次调用的ajax()的时候,就直接调用变量。

优化重点

要执行特定代码只有实际调用才执行,而某些JS库一开始就检测浏览器,预先设置好。

由于加了复杂的判断所以首次运行速度慢,但后边的多册运行的效率会更快。
 
有时候写代码久了,不能一成不变,要经常思考怎样才能使程序运行的更快,更有效率。这样的思考下写出来的程序才是精装,而不会产生多余的垃圾代码。这也不是简单OO就能一刀切,实际上代码很多地方都是活的,人更是活的。

Javascript 相关文章推荐
js判断字符长度及中英文数字等
Mar 19 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
JavaScript生成SQL查询表单的方法
Aug 13 Javascript
jQuery图片轮播滚动切换代码分享
Apr 20 Javascript
原生js模拟淘宝购物车项目实战
Nov 18 Javascript
什么是JavaScript中的结果值?
Oct 08 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
Dec 22 Javascript
vue中页面跳转拦截器的实现方法
Aug 23 Javascript
jQuery实现的滑块滑动导航效果示例
Jun 04 jQuery
JS中的防抖与节流及作用详解
Apr 01 Javascript
es6中使用map简化复杂条件判断操作实例详解
Feb 19 Javascript
IE浏览器不支持getElementsByClassName的解决方法
Aug 27 #Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
Aug 27 #Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 #Javascript
JavaScript中switch判断容易犯错的一个细节
Aug 27 #Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 #Javascript
JavaScript中输出标签的方法
Aug 27 #Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 #Javascript
You might like
我的论坛源代码(三)
2006/10/09 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php后门URL的防范
2013/11/12 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
RequireJs的使用详解
2017/02/19 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python入门篇之数字
2014/10/20 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
Sony C++笔试题
2013/03/10 面试题
保送生自荐信范文
2013/10/06 职场文书
教师档案管理制度
2014/01/23 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
模范班主任事迹材料
2014/12/17 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js