将别名添加到Chrome控制台日志

22

我想知道为什么以下代码在Google Chrome中无法工作:

// creates a xss console log

var cl = ( typeof( console ) != 'undefined' ) ? console.log : alert;
cl('teste');

输出结果:Uncaught TypeError: Illegal invocation

谢谢。


我刚遇到了一个类似的问题,我想要重写console.log方法(以捕获和发送输出)。我的解决方案是在console对象上声明别名。大致如下:console.__log = console.log;console.log = function(){__console.log.apply(console, arguments);}; - Rob W
3个回答

31

当你写下cl();时,你调用了全局上下文中的log

Chrome的console.log不希望在window对象上被调用。

相反,你可以写成

cl = function() { return console.log.apply(console, arguments); };

这将在console的上下文中调用log


5
关于“上下文”这个问题,我写了几篇博客文章可能会有所帮助:*神话般的方法* 和 *你必须记住this*。 - T.J. Crowder
4
这种方法的缺点是在Web检查器中无法记录正确的行号。 - Justin

31

1
我爱你,这让我疯狂了多年。 - Kevin
终于有解决方案了!谢谢 :D - M K

2

很不幸,@SLaks的答案在IE中无法应用,因为它使用window对象作为console.log方法的上下文。

我建议另一种不依赖于浏览器的方法:

!window.console && (console = {});

console.debug = console.debug || $.noop;
console.info = console.info || $.noop;
console.warn = console.warn || $.noop;
console.log = console.log || $.noop;

var src = console, desc = {};
desc.prototype = src;
console = desc;

desc.log = function(message, exception) {
    var msg = message + (exception ? ' (exception: ' + exception + ')' : ''), callstack = exception && exception.stack;
    src.log(msg);
    callstack && (src.log(callstack));
    //logErrorUrl && $.post(logErrorUrl, { message: msg + (callstack || '') }); // Send clientside error message to serverside.
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接