在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
。我不确定为什么。有什么想法吗?
答案 0 :(得分:3)
console实际上是一个对象,方法log()需要使用范围来访问该对象,例如
document.addEventListener("click", console.log.bind(console, "test"), false);
答案 1 :(得分:1)
总是有必要考虑this
是什么。
您拨打console.log
的方式,this
未设置(除非您处于严格模式默认为window
)。但是,该函数期望this
为console
,从而提供“非法调用”和“调用未实现接口控制台的对象” - 您实际上无需调用它(或窗口) )
似乎代码旨在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);
答案 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);