在函数执行的时候在处理函数,在函数第一次调用的过程当中,该函数会被重写覆盖成另外一个按照合适方式执行的函数,下面见例子:建立XHR function createXHR () {
if (typeof XMLHttpRequest != 'undefined') {
return new XMLHttpRequest();
} else if (typeof ActiveXObject != 'undefined') {
if (typeof arguments.callee.activeXString != 'string'){
var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'],
i,len;
for (i = 0,len=version.length; i < len; i++) {
try {
new ActiveXObject(version[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (ex) {
// 跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error('NO XHR');
}
}
每次执行这个建立函数都会去执行内部的那些判断语句,因此见以下改写该函数,重写原函数,下一次调用时就会直接调用分配好的函数 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.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'],
i,len;
for (i = 0,len=version.length; i < len; i++) {
try {
new ActiveXObject(version[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (ex) {
// 跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
} else {
createXHR = function () {
throw new Error('NO XHR');
}
}
// 最后返回预期
return createXHR();
}