Javascript数组:数组声明和访问的问题

时间:2015-03-24 08:55:44

标签: javascript arrays scope declaration

我正在研究一个小项目,以便学习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()

3 个答案:

答案 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

即可