这是我在《高级3》看到的一段代码,不明白这种写法怎么被优化了?
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 version =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0"],
i,len;
for (i=0,len=version.length;i<len;i++) {
try{
new ActiveXobject[version[i]];
arguments.callee.activeXString = versions[i];
break;
}catch(ex){
//skip
}
}
}
}
}else{
createXHR = function () {
throw new Error("No XHR object available.");
}
}
return createXHR();
}
createXHR ();
惰性载入函数,函数被第一次执行时会被新的函数覆盖,之后执行时就不需要进行浏览器能力检测。
这叫lazy assignment
本来呢,createXHR要根据不同环境执行不同代码,但由于运行环境的不变性,每执行一次createXHR就判断一次显然太浪费性能了;如果是一开始就根据不同环境给createXHR赋不同的值,在某些情况下也很浪费,因为你不一定会用到它。
而这种方法,只在第一次执行时判断环境并给createXHR赋上不同的值,这就完美解决了上面的问题。
首先JS中函数也是对象,函数也是可以被定义赋值,修改的
注意到没有函数的名为
createXHR
在函数体中createXHR = function () {
就是对函数重新赋值
经过不同的条件判断后,createXHR函数已经不是最初定义时候的模样啦,已经有了新的定义
函数体的最后return createXHR();
此时的createXHR已经不是函数声明的时候的那个喽,是在函数体中被重新赋值过的
可以用立即执行函数+闭包实现这个,好理解写:
var createXHR=(function(){
var getXHRFunc;
if (typeof XMLHttpRequest != 'undefined') {
getXHRFunc = function () {
return new XMLHttpRequest();
};
}else if(typeof ActiveXObject != 'undefined'){
getXHRFunc = function () {
if (typeof arguments.callee.activeXString != 'string') {
var version =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0"],
i,len;
for (i=0,len=version.length;i<len;i++) {
try{
new ActiveXobject[version[i]];
arguments.callee.activeXString = versions[i];
break;
}catch(ex){
//skip
}
}
}
}
}else{
getXHRFunc = function () {
throw new Error("No XHR object available.");
}
}
return function(){
return getXHRFunc;
}
}());
具体是怎么判断的,还是不懂啊