console.log在Chrome和IE中引发错误

时间:2016-08-02 17:36:05

标签: javascript google-chrome firefox webkit

在Stoyan Stefanov的优秀书籍 JavaScript Patterns 中,他给出了以下示例作为一次性回调:

document.addEventListener("click", console.log, false);

在Chrome中,这会引发Uncaught TypeError: Illegal invocation在Firefox中引发TypeError: 'log' called on an object that does not implement interface Console.在Safari中,它会抛出一个通用TypeError: Type error。我不确定为什么。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

console实际上是一个对象,方法log()需要使用范围来访问该对象,例如

document.addEventListener("click", console.log.bind(console, "test"), false);

答案 1 :(得分:1)

总是有必要考虑this是什么。

您拨打console.log的方式,this未设置(除非您处于严格模式默认为window)。但是,该函数期望thisconsole,从而提供“非法调用”和“调用未实现接口控制台的对象” - 您实际上无需调用它(或窗口) )

似乎代码旨在console.log事件数据,在这种情况下,您应该明确这样做:

document.addEventListener("click", function(e) {console.log(e);}, false);

请注意,由于它被称为“正常”,因此this将是浏览器所期望的console,并按预期运行。

但我建议将其更改为console.dir(e),以便您可以实际探索对象数据,因为我认为[object PointerEvent]不是很有用。

答案 2 :(得分:0)

这是因为console.log是本机方法,您不能在不同的上下文中调用它。当您将其作为回调传递时,您基本上将其分配给不同的上下文。如果您执行以下操作,也会发生相同的情况:

var foo = console.log;
foo(1, 2, 3);

这是reference SO answer

答案 3 :(得分:0)

我意识到O' Reilly的书通常都有一个"勘误表"在线页面,果然有我的答案(第66页)。

document.addEventListener("click", console.log.bind(console), false);

http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596806767

答案 4 :(得分:-1)

console.log()是一个函数!所以你可以像这样使用;

document.addEventListener("click", function(){
    console.log("test log");
}, false);