3

而是一个关于 javascript 事件的技术问题:

为什么

window.onmousewheel = console.log;

抛出一个Uncaught TypeError: Illegal invocation,而

window.onmousewheel = function (e) {console.log(e); };

按预期工作并将事件打印为字符串?为什么console.log, 当分配给 时window.onmousewheel,不只是像 lambda 表达式那样使用一个参数来调用?

西蒙

4

2 回答 2

7

当函数在没有明确接收者的情况下被调用时,接收者是window(或更一般地说是全局对象)或undefined取决于严格性。引用的函数console.log要求其this值为 的实例Console

它通常不在用户代码中完成,但您也可以保护您的方法免受通用调用:

MyClass.prototype.method = function() {
    if( !( this instanceof MyClass ) ) {
        throw new Error("Invalid invocation");
    }
};
于 2013-07-29T17:42:35.707 回答
3

这一切都与范围有关console.log

应该这样做:

window.onmousewheel = console.log.bind(console);

于 2013-07-29T17:41:54.323 回答