为什么会抛出未捕获的TypeError:非法调用

时间:2015-01-18 19:53:09

标签: javascript web typeerror

为什么会抛出“未捕获的TypeError:非法调用”?

function Game () {
    this.reqAnimFrame = window.requestAnimationFrame;

    this.gameLoop = function () {
        this.reqAnimFrame(this.gameLoop); // It's thrown on this line
    };
}

var game = new Game();
game.gameLoop();

1 个答案:

答案 0 :(得分:5)

当您致电this.reqAnimFrame时,window.requestAnimationFrame的上下文不再是window,而是成为this的任何内容(在这种情况下,Game的实例})。除非使用正确的上下文调用它们,否则大多数内置函数都不起作用。 (例如,像

var func = console.log; func("blah");

也不起作用,出于同样的原因)。

要解决此问题,您应该只使用原始格式:window.requestAnimationFrame,或者可以在存储时将其绑定到正确的上下文:

this.reqAnimFrame = window.requestAnimationFrame.bind(window);