在函數執行的時候在處理函數,在函數第一次調用的過程當中,該函數會被重寫覆蓋成另外一個按照合適方式執行的函數,下面見例子:建立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();
}