JavaScript 作用域问题(this)

标签 javascript

我尝试以面向对象的方式组织我的代码(如 MDN 中所述)。然而,就我而言,this 指的是窗口对象。因此我收到错误

Uncaught TypeError: Cannot read property 'render' of undefined

this.renderer.render(this.stage);

为什么 this 引用了 window 对象,而 MDN 上却没有?

var GAME = GAME || {};

GAME.Application = function() {
    this.renderer = PIXI.autoDetectRenderer(800, 600,{backgroundColor : 0x1099bb});
    document.getElementById("game").appendChild(this.renderer.view);
    this.stage = new PIXI.Container();
    requestAnimationFrame(this.render);
}

GAME.Application.prototype.render = function() {
    this.renderer.render(this.stage);
}

var app = new GAME.Application();

最佳答案

您需要绑定(bind)您的render函数。这可能是最直接的解决方案。

requestAnimationFrame(this.render.bind(this));

或者,你也可以这样做

var context = this;
requestAnimationFrame(function() {
  context.render();
});

或者您可以避免创建自由变量并使用 IIFE

requestAnimationFrame((function(context) {
  context.render();
})(this)));

或者,如果您使用的是 ES6,则可以使用箭头函数

requestAnimationFrame(() => this.render());
<小时/>

您可以进行的另一个简单改进是将渲染元素传递到应用程序构造函数中

function Application(elem) {
  this.renderer = ...
  elem.appendChild(this.renderer.view);
}

new Application(document.getElementById("game"));

关于JavaScript 作用域问题(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30812757/

相关文章:

javascript - angular.js 上的 ASP.NET 捆绑和缩小失败

JavaScript 变量 : var a =(3, 4,7);

javascript - 如何为 Canvas 形状提供圆形内阴影?

javascript - 连接和缩小后如何使用 require js 文件

javascript - 在 Flux 中,什么负责直接与 API 对话

javascript - 检查输入是否以特定字符结尾

javascript - rails 5 : how to respond_to js after redirect?

javascript - 在 Javascript 中执行后台任务

javascript - getJSON没有输出?

javascript - 如何在 PHP 中动态创建按钮名称并检测按下了哪个按钮?