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 相关文章推荐
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
js如何取消事件冒泡
Sep 23 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
JavaScript定义类和对象的方法
Nov 26 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
JavaScript获取数组最小值和最大值的方法
Jun 09 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
JavaScript反射与依赖注入实例详解
May 29 Javascript
详解Vue源码中一些util函数
Apr 24 Javascript
深入了解JS之作用域和闭包
Jun 16 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
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php Calender(日历)代码分享
2014/01/03 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
python实现文件批量编码转换及注意事项
2019/10/14 Python
python常用数据重复项处理方法
2019/11/22 Python
pytorch 修改预训练model实例
2020/01/18 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
四种会话跟踪技术
2015/05/20 面试题
领导证婚人证婚词
2014/01/13 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
大学班级学风建设方案
2014/05/01 职场文书
小学校长汇报材料
2014/08/20 职场文书
心得体会的写法
2014/09/05 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
小学家长通知书评语
2014/12/31 职场文书
2015中学教学工作总结
2015/07/22 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers