【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>
执行结果:


浙公网安备 33010602011771号