【JavaScript高级程序设计】24、惰性载入函数和函数柯里化

1、惰性载入函数

就是在创建函数的时候动态创建函数

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>惰性载入函数</title>
</head>
<body>
    <script type="text/javascript">
        //惰性载入
        function createXHR()
        {
            //判断是否XMLHttpRequest这个类
            if(typeof XMLHttpRequest != "undefined")
            {
                //如果不是未定义,那么下次就不用执行了,直接创建就可以了
                createXHR = function(){
                    return new XMLHttpRequest();
                };
            }
            else if(typeof ActiveXObject != "undefined")
            {
                //这个就是ie的时候
                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 
                            {
                                var xhr = new ActiveXObject(versions[i]);
                                arguments.callee.activeXString = versions[i];
                                return xhr;
                            } 
                            catch (ex)
                            {
                                //skip
                            }
                        }
                    }
                };
            }
            else
            {
                //不是ie,也不是其他浏览器,那么就报错
                createXHR = function(){
                    throw new Error("没有XMLHttpRequest这个类");
                };
            }
        }

        //上面的代码还是需要执行一次之后才会分离,那么这里直接在创建函数的时候进行判定
        var createXHR2 = (function(){
            //判断是否XMLHttpRequest这个类
            if(typeof XMLHttpRequest != "undefined")
            {
                //如果不是未定义,那么下次就不用执行了,直接创建就可以了
                createXHR = function(){
                    return new XMLHttpRequest();
                };
            }
            else if(typeof ActiveXObject != "undefined")
            {
                //这个就是ie的时候
                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 
                            {
                                var xhr = new ActiveXObject(versions[i]);
                                arguments.callee.activeXString = versions[i];
                                return xhr;
                            } 
                            catch (ex)
                            {
                                //skip
                            }
                        }
                    }
                };
            }
            else
            {
                //不是ie,也不是其他浏览器,那么就报错
                createXHR = function(){
                    throw new Error("没有XMLHttpRequest这个类");
                };
            }
        })();

    </script>
</body>
</html>

 

 

 

 

 

 

 

2、函数柯里化

借助这个方法把接受多个参数的函数变为接受一个参数的函数,并且返回接受余下的参数而且返回结果的新函数

 

参考:http://bbs.csdn.net/topics/330137455

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>函数柯里化</title>
</head>
<body>
    <script type="text/javascript">
        
        function curry(fn)
        {
            //获取参数列表,去掉第一个参数
            var args = Array.prototype.slice.call(arguments, 1);
            return function(){
                //获取全部参数
                var innerArgs = Array.prototype.slice.call(arguments);
                var finalArgs = args.concat(innerArgs);

                //调用fn函数
                return fn.apply(null, finalArgs);
            };
        }

        function add(num1, num2)
        {
            return num1 + num2;
        }

        //这里两个参数,一个是函数,一个是参数,这个会传到
        var curriedAdd = curry(add, 5);
        alert(curriedAdd(3));
        
    </script>
</body>
</html>

 

执行结果:

 

posted @ 2016-08-23 23:09  cutter_point  阅读(123)  评论(0)    收藏  举报