javascript中惰性载入函数

我们都知道如果创建一个xhr对象(不会写,不怕,有百度,嘿嘿)

function createXHR(){
    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"],
                        i,len;
                for (i=0,len=versions.length; i < len; i++){
                    try {
                        new ActiveXObject(versions[i]);
                        arguments.callee.activeXString = versions[i];
                        break;
                    } catch (ex){
                        //跳过
                    }
        }
    }
            return new ActiveXObject(arguments.callee.activeXString);
    } else {
            throw new Error("No XHR object available.");
    }
}

这个函数相信大家都见过,每次调用createXHR的时候,都要检测浏览器是否支持XMLHttpRequest对象,里面基本上都是一层一层的if…else… 还有 try…catch….每次都这样,想想也烦.

看看书中的方法:

第一种方法

function createXHR(){
        if (typeof XMLHttpRequest != "undefined"){
                createXHR = function(){
                        return new XMLHttpRequest();
                };
        } else if (typeof ActiveXObject != "undefined"){
            createXHR = function(){
                    if (typeof arguments.callee.activeXString != "string"){
                            var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
                                   i, len;
                            for (i=0,len=versions.length; i < len; i++){
                                    try {
                                        new ActiveXObject(versions[i]);
                                        arguments.callee.activeXString = versions[i];
                                        break;
                                    } catch (ex){
                                        //skip
                                    }
                            }
                   }
                   return new ActiveXObject(arguments.callee.activeXString);
               };
        } else {
                createXHR = function(){
                throw new Error("No XHR object available.");
                };
        }
        return createXHR();
}

这里我们发现, 每一次分支都会对createXHR赋值 , 在第一次执行createXHR的时候,如果有内置的XMLHttpRequest对象,createXHR函数会被覆盖,下次再调用的时候,就会调用已经被覆盖的createXHR函数,直接返回一个XMLHttpRequest对象,其他的分支也是类似的, 最后一步就是调用新的createXHR函数

这里的情景是:浏览如果支持内置的XHR或者基于ActiveX的XHR,就会一直支持,在这种情况下,其实只需要一次检测就够了,所以覆盖createXHR是合适的

第二种方法

var createXHR = (function(){
                    if (typeof XMLHttpRequest != "undefined"){
                            return function(){
                                    return new XMLHttpRequest();
                            };
                    } else if (typeof ActiveXObject != "undefined"){
                            return    function(){
                                                    if (typeof arguments.callee.activeXString != "string"){
                                                        var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",   "MSXML2.XMLHttp"],
                                                                i, len;
                                                        for (i=0,len=versions.length; i < len; i++){
                                                                    try {
                                                                                new ActiveXObject(versions[i]);
                                                                                arguments.callee.activeXString = versions[i];
                                                                                break;
                                                                    } catch (ex){
                                                                            //skip
                                                                    }
                                                        }
                                                   }
                                            return new ActiveXObject(arguments.callee.activeXString);
                                      };
                      } else {
                                    return function(){
                                            throw new Error("No XHR object available.");
                                    };
                    }
     })();

第二种其实和第一种逻辑上是一样的,只不过多了第一行代码(使用var定义函数)、新增了自执行的匿名函数

总体来说,这个惰性载入函数还是有点价值的吧,只是牺牲一点性能和代码量,就能减少不必要执行的代码,但是注意会覆盖原来的函数…

时间: 2024-11-06 23:27:03

javascript中惰性载入函数的相关文章

惰性载入函数

惰性载入函数由来 惰性载入函数的概念,最早见于<javascript高级程序设计>这本书:去年某个时候,自己偶然翻到了这一章:忽然感觉挺有道理的.最近呢,老是接触ajax这东东,我们知道浏览器之间行为的差异造成我们使用ajax,特别是创建XHR对象时,使用了大量的if判断,来做兼容性的处理.所以再次细细咀嚼了一下,写一篇博客分享再次强化. 常见的创建XHR对象的方式,类似如下代码: //创建XHR对象 function createXHR() { if (typeof XMLHttpReque

JavaScript中的回调函数

在学习JavaScript的过程中遇到了很多,使用到回调函数的例子,出现了许多疑问,就由一个栗子开始吧: 在JavaScript中接触的第一个回调函数是在setInterval()和setTimeout()中出现的: 1 var num = 10; 2 3 var interValId = setInterval(function (){ 4 console.log(num); 5 num--; 6 if(num==0){ 7 clearInterval(interValId); 8 } 9 }

理解与使用Javascript中的回调函数 -2

在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply()函数的,或者有一些简短的关于callback的使用示例. 函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用 Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串

Javascript 中的回调函数和递归函数简单实际分析学习

Javascript 中的回调函数和递归函数简单实际分析学习 1 回调函数 所谓回调函数简单理解就是将一个函数做为参数传递给其他的函数供其使用.(只是在js中,因为其它的语言中有指针这个概念). 举一个简单的例子,当我们在统计账单的时候就要整理材料这些,然后就需要计算器,计算器我们想象成为一个可以实现计算的函数.统计账单是另外的另一个函数,当统计账单的时候就会需要计算器这个函数的支持,其实这就是一个简单的回调.可以按这个理解. 下来我借用网上的一个例子: //先定义一个函数fun1 functi

javascript中定义声明函数的四种方法

javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N

JavaScript中字符串分割函数split用法实例

这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaScript中字符串分割函数split用法.分享给大家供大家参考.具体如下: 先来看下面这段代码: <script type="text/javascript"> var str="How are you doing today?" document.write

JavaScript中的匿名函数及函数的闭包以及作用域

1. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

理解和使用 JavaScript 中的回调函数

原文:http://javascriptissexy.com/ 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后

Javascript中的回调函数和匿名函数的回调

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 匿名函数自调的意义: 1.营造了一个封闭的空间 2.防止变量冲突 3.有选择性的对外开发(第三方框架都是对js这样封装的) */ //===