概念:在javascript里函数可以动态定义,如果创建了一个新函数并且将其分配给保存了另外函数的同一个变量,那么新函数覆盖旧函数。常用于初始化功能。
原理:同名函数覆盖重写
适用场景:在固定的应用环境不会发生改变,频繁使用同一判断逻辑,一次判定,多次直接使用
来个经典例子:创建XHR请求,需要进行能力检测,如下:
function createXHR(){
if (typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest();
} else if (typeof ActiveXObject != "undefined"){
if (typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp"];
for (var 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
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error("No XHR object available.");
}
}
页面有多次请求,每次创建XHR都去能力检测,是不是有些浪费呢,如果我们在第一次调用的时候,重写函数,剩下的调用不再进行能力检测,是不是提高代码性能呢,例子如下
function createXHR() {
if (typeof XMLHttpRequest != "undefined") {
createXHR = function () {
return new XMLHttpRequest();
}
return new XMLHttpRequest();
} else if (typeof ActiveXObject != "undefined") {
var curxhr;
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp"];
for (var i = 0, len = versions.length; i < len; i++) {
try {
var xhr = new ActiveXObject(versions[i]);
curxhr = versions[i];
createXHR = function () {
return new ActiveXObject(curxhr);
}
return xhr;
} catch (ex) {
//skip
}
}
} else {
throw new Error("No XHR object available.");
}
}
console.log(createXHR) /* 结果为原函数
ƒ createXHR() {
if (typeof XMLHttpRequest != "undefined") {
createXHR = function () {
return new XMLHttpRequest();
}
return new XMLHttpRequest();
} else if (typeof ActiveXObject != "undefined") {
var curxhr;
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp"];
for (var i = 0, len = versions.length; i < len; i++) {
try {
var xhr = new ActiveXObject(versions[i]);
curxhr = versions[i];
createXHR = function () {
return new ActiveXObject(curxhr);
}
return xhr;
} catch (ex) {
//skip
}
}
} else {
throw new Error("No XHR object available.");
}
}
*/
打印结果为原函数
createXHR(); //调用
console.log(createXHR) //结果为执行了一次后重写的得到的函数 ƒ () { return new XMLHttpRequest(); }