我正在研究一个小项目,以便学习Js和OOP。但我有一个问题,让我解释一下不同的步骤:
1)我的构造函数:
function Ammo(ammoId,posX,posY){
this.id=ammoId;
this.x=posX;
this.y=posY;
$('body').append('<div class="ammo ammo'+this.id+'"></div>');
}
2)原型:
Ammo.prototype.position = function(){
$('.ammo'+this.id).css({
'top': this.y+"px",
'left': this.x+"px"
});
}
Ammo.prototype.ammomove = function(){
this.y-=1;
this.position();
}
3)电话:
ammo=[];
var a=1;
function createAmmo(){
var ammoX=main.x;
var ammoY=main.y;
ammo[a] = new Ammo(a, ammoX, ammoY);
ammo[a].position();
var animAmmo= setInterval("ammo["+a+"].ammomove()",5);
a++;
}
createAmmo();
我的程序运作完美。但是当我用这种语法声明我的数组时:
var ammo = [];
它不起作用,我有错误“弹药未定义”,而这是有效的:
ammo = [];
有人有想法吗? thx!
编辑:这是我的JsFiddle:https://jsfiddle.net/seabon/c057f1oj/
按空格键调用createAmmo()
答案 0 :(得分:0)
var
关键字定义局部变量。这意味着变量仅在当前范围内可见。
当您使用ammo = [];
时,它会创建全局变量,可以从createAmmo()
访问。
但是当你使用var ammo = [];
时,它会创建局部变量。在同一范围内声明了方法createAmmo()
,但您无法访问它
范围来自createAmmo
。
将其作为参数传递到createAmmo
。
答案 1 :(得分:0)
如果您使用 var 关键字来声明变量,那么该变量将在声明的范围内属于本地它不能在其他范围内访问,如果你使用:
var ammo = [];
您的ammo
变量本地且无法在函数内部访问(因为每个函数都有自己的范围),但是当您使用方法:
ammo = [];
您的ammo
变量全局,可以在整个应用中访问。
修改强>
为了纠正我的答案,在这种情况下你可以访问createAmmo()函数中的a和ammo,因为它们都在同一范围内,但这里的问题是由这条指令引起的:
var animAmmo= setInterval("ammo["+a+"].ammomove()",5);
每次都会导致无限循环并抛出ammo is not defined
,我尝试调试您的代码,我认为这是由setInterval()
解释{{1}引起的作为一个函数,还要注意它是一个反模式来将一个String而不是一个函数传递给JavaScript Anti-Patterns section here中所述的setInterval(),你可以避免这个通过调用ammo
而不使用双引号,如下所示:
ammo[a].ammomove()
它会完美运行,试试这个DEMO它会在控制台中记录var animAmmo= setInterval(ammo[a].ammomove(),5);
的所有更改。
答案 2 :(得分:0)
考虑一下!
这正是您问题的答案!
使用var
关键字时,您无法在同一范围内第二次定义它!你不能在同一范围内覆盖它。
JavaScript范围不是{...}
内的代码。它涵盖function xx(){...}
内的所有代码。因此,当您编写ammo=[]
和a=1
以及ammo[a]
时,JavaScript会尝试定义另一个具有相同名称的变量,然后成功覆盖全局ammo
数组!这是成功的,因为没有var
个关键字。如果存在var
关键字,则ammo [1]未知,因此未定义!请记住,数组索引从0开始。
使用弹药[a],就像您尝试访问/为新对象1
的名称为ammo
的属性分配值一样。
只需将a=1
更改为a=0