当我覆盖console.log时,为什么会出现“超出最大调用堆栈大小”?

时间:2012-02-06 18:10:57

标签: javascript

这是代码..

function getMilli(){
    return new Date().getTime().toString().substr(7,6);
}
console.log = function(p1, p2, p3, p4, p5, p6){
    console.log(getMilli(), p1, p2, p3, p4, p5, p6);
}

它以某种方式出现“堆栈溢出”错误,但我不明白为什么在这里......我不是递归迭代的东西(至少我认为)


......呃,是的,我在做递归的东西......但我不知道怎么做。感谢您的答案和伟大的概念。

3 个答案:

答案 0 :(得分:4)

以递归方式调用函数console.log。换句话说,您在console.log内呼叫console.log

你可能想做的是:

(function(){

    var clog = console.log.bind(console);

    console.log = function(p1, p2, p3, p4, p5, p6){
        clog(getMilli(), p1, p2, p3, p4, p5, p6);
    }

})();

答案 1 :(得分:4)

作为其他有效解决方案的改进:

  1. 避免污染全局范围或任何对象的属性以存储原始console.log。
  2. 避免指定任意数量的占位符参数,如p1,p2,p3等。
  3. 使用闭包来存储原始console.log并删除对任意参数声明的依赖:

    console.log = function (log) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            args.unshift(getMillis()); // Push millis as first argument
            log.apply(console, args);
        };
    }(console.log);
    

    http://jsfiddle.net/9BPuc/

答案 2 :(得分:1)

显然你是在console.log内调用console.log,因为当你将它重新分配给新功能时,它不会保留与旧功能的链接(为什么要这样?)

你要做的是:

console.old_log = console.log;

console.log = function() { 
  var args = Array.prototype.slice.call(arguments);
  args.unshift(getMilli()); 
  console.old_log.apply(console, args)
}