构造函数函数.可以't覆盖对全局变量的引用
Constructor function. Can't overwrite reference to global variable
我使用这个构造函数为游戏创建对象。现在,一系列的图像每次都会被覆盖,这样所有的对象在屏幕上看起来都是一样的。
这是有问题的对象:
function Box() {
this.ready = false;
this.pics = pictures;//[];
this.state = 0;
this.x = 0;
this.y = 0;
this.w = 1;
this.h = 1;
this.fill = "#444";
this.load = function(array){
var foo = [];
pictures = [];
for(var i = 0; i < array.length; i++){
pictures.push(loadPic(array[i]));
foo.push(loadPic(array[i]));
}
//this.pics = pictures;
this.pics = foo;
}
}
线路
this.pics = foo;
似乎什么都没做。
此外,如果我将图片的初始值更改为"图片"(这是一个全局变量)以外的任何值,游戏就不会开始。
Contex:https://github.com/kaninepete/Javascript-Games/blob/images/MVP.js
试试这个:
var $this = this;
this.load = function(array){
//...
$this.pics = foo;
}
您必须注意,函数内部的this
与构造函数中的this
不同。实际上,load()
函数中的一个指向浏览器window
对象。
相反,我们定义了一个名为$this
的变量(大多数人更喜欢模式中的that
),并从函数内部引用它,使其成为闭包。
最初,您要创建player
和target
对象,并通过调用load
加载它们的图片。因为您使用的是对象点方法语法,例如player.load
来调用函数,所以对this
的所有引用都应该根据需要/预期进行设置。
然而,要开始游戏,您需要调用reset
(例如从myDown
)。在reset
中,player
和target
中的对象被新实例替换(注意对addRect
的调用)。方法load
从未在新实例上被调用,因此两者都留下相同的图片(如最初在Box
中设置的全局pictures
)。因为两者共享相同的数组pictures
,所以它们最终被绘制为相同的。
一般建议:我建议去掉全局变量,因为它们之间的依赖关系并不明显。然后应该调用reset
函数进行初始化,而不是在全局级别加倍实现。在引入事件处理程序之前,请先尝试绘制静态图片。
在单独的函数中使用this
不会指向变量所属的对象。
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 返回语句后的函数声明全局变量不会被覆盖
- 如何保护全局变量以在 Node.js 中被覆盖
- 为什么我已经定义的全局变量被IE8中的另一个var语句覆盖
- 拼接上的Javascript全局变量作用域/覆盖
- 试图覆盖全局变量时出现jQuery.post()作用域问题
- 构造函数函数.可以't覆盖对全局变量的引用
- 覆盖全局变量
- 访问函数内被覆盖的全局变量
- Javascript -克隆的全局变量被覆盖
- 为什么我的全局变量在JSFiddle上被覆盖
- 覆盖现代浏览器中的全局变量
- 用局部变量覆盖全局变量