關於重寫console.log的方式通常都是這樣的:
console.log = (function(oriLogFunc){
return function(str)
{
oriLogFunc.call(console,"hello:"+str);
}
})(console.log);
console.log("dami");
在這里,通過立即執行函數傳入console.log參數,然后返回一個方法,而在返回的方法里面保持了對console.log的引用,這其實是一個閉包,所以我們重寫了console.log卻仍然可以使用console.log方法的原因:console.log指向一個方法,這個方法實現了輸出功能,console.log只是指向那里,然后當作參數傳入立即執行函數后,在立即執行函數里面我們實際上拿到的也是這個指向輸出方法的地址,而console.log不過是個表皮,所以最重要的是拿到對輸出方法的引用,並並保持這個引用,所以如果是這樣,不使用閉包也是可以的
var log = console.log; console.log = function(text){ log("info"+text); //log.call(console,"info"+text);//使用call讓log里面的this指向console,而不是window } console.log("dami")
在這里我們把console.log賦值給log 這樣log就拿到了對輸出方法的引用,所以下面重寫console.log的時候我們可以使用log來輸出,這里有個注意點,在注釋部分,我們應該使用log.call(console,"")而不是直接使用log來輸出,這牽涉到log方法里this指向的問題,如果直接使用log()那this指向window,這顯然不是我們希望的,我們希望他向console.log方法一樣指向console,所以這里要使用log.call(console,"")
