重写console.log的一些理解

Posted 大米

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写console.log的一些理解相关的知识,希望对你有一定的参考价值。

关于重写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,"")

以上是关于重写console.log的一些理解的主要内容,如果未能解决你的问题,请参考以下文章

重写js console

webstorm代码片段的创建

前端开发常用js代码片段

jacript var let const 区别

对javascript变量提升跟函数提升的理解

JS如何重写一个函数