- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以向我解释一下为什么我会得到:
Uncaught TypeError: Cannot read property 'canvas' of undefined game.js:48
Uncaught TypeError: Cannot call method 'resize' of undefined game.js:4
由于某种原因,this.stage 似乎超出了启动函数的范围。
//index.js
var game;
function init()
{
game = new Game(document.getElementById('canvas'));
}
function resize()
{
game.resize();
}
_
//game.js
function Game(canvas)
{
this.canvas = canvas;
this.stage = null;
this.loader = null;
this.scaleCanvas();
this.initCreateJS();
this.loadAssets();
}
Game.prototype =
{
resize: function()
{
this.scaleCanvas(this.canvas);
this.level.resize(this.canvas.width, this.canvas.height);
this.stage.update();
},
scaleCanvas: function()
{
this.canvas.width = window.innerWidth;
this.canvas.height = window.innerHeight;
},
initCreateJS: function()
{
this.stage = new createjs.Stage(this.canvas);
createjs.Ticker.setFPS(30);
this.stage.enableMouseOver(10);
if(createjs.Touch.isSupported())
{
createjs.Touch.enable(this.stage);
}
},
loadAssets: function()
{
manifest = [
{src:"base.png", id:"base"},
{src:"logo.png", id:"logo"}
];
this.loader = new Loader(manifest, this.start);
},
start: function()
{
this.level = new Level(4,4,this.stage.canvas.width,game.stage.canvas.height);
this.level.randomLevel();
this.level.print();
game.stage.addChild(this.level);
game.stage.update();
}
};
最佳答案
考虑一下:
var Foo = function(val) {
this.val = val;
}
Foo.prototype.log = function() {
console.log('Me haz ' + this.val);
}
这里我们定义了一个相当简单的类Foo
:使用构造函数将其参数分配给名为 val
的属性,以及单个方法 log
处理Foo.prototype
上定义的这个值。没什么特别的:
var foo = new Foo(42);
foo.log(); // Me haz 42
现在我们定义一个简单的函数 - 它接受另一个函数作为参数,并调用这个函数。像这样的事情:
var fooCaller = function(cb) { cb(); }
fooCaller(function() {
console.log('I am called');
});
这很简单,对吧。但现在事情突然变得复杂了:
fooCaller(foo.log); // Me haz undefined
什么?显然,正确的函数已被调用(因此 Me haz...
) - 但为什么 this.val
是 undefined
,而不是42
那里?调用 foo.log
之间发生了什么变化直接或通过调用者函数?
差异是this
。你看,JavaScript 的一个独特功能是能够为同一函数切换上下文( this
引用的对象)而无需触及其主体:只有调用函数的方式才重要。有两种特殊方法允许您显式设置 this
的值: Function.prototype.call和 Function.prototype.apply 。例如:
var bar = new Foo(34);
bar.log(); // Me haz 34
bar.log.call(foo); // Me haz 42
如您所见,call
我已经换了this
来自 bar
的对象(其中 val
属性等于 34)到 foo
。请注意,哪个对象“拥有”该函数已经不再重要。
现在让我们回到您自己的代码。这条线...
new Loader(manifest, this.start);
... 显然是有问题的:将未绑定(bind)的对象方法作为回调传递几乎总是一个坏主意。在这种情况下,Loader最终会调用this.start
中存储的函数。 - 但当它发生时,this
将指向另一个对象。
为了防止这种情况,您需要绑定(bind)上下文:传递到 new Loader
另一个由 this
的当前值定义的函数。最简单的方法是使用 Function.prototype.bind :
new Loader(manifest, this.start.bind(this));
...这基本上会创建另一个具有固定值 this
的函数(由其当前值定义)。
这虽然相当广泛,但只是快速浏览一下this
JavaScript 中的函数(不仅仅是函数,没有双关语)))。我建议检查this answer - 以及其中提到的文章,它们肯定会很有启发。 )
关于javascript - 访问类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911765/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!