2013-11-01 123 views
1

我想插入一个值到数组中,但是当我尝试插入值时,它给了我Connot set属性'0'的未定义。但显然我已经定义了阵列。未捕获TypeError:无法设置未定义的属性'0'

错误行:

this.enemyMinions[i] = new EnemyCombatMinion(new Minion(enemyMinionInfo[0], 0, enemyMinionInfo[1], enemyMinionInfo[2], enemyMinionInfo[3], 0, 0, 0, 0, 0, 0)); 

这是整个代码:

function Combat() { 
    this.enemyMinions = []; 
    this.playerMinions = []; 
    this.currentEnemyMinion = null; 
    this.currentPlayerMinion = null; 
} 

Combat.prototype.initialize = function() { 
    var o = 0; 
    for(var i = 0; i < partySlots.length; i++) { 
    if(partySlots[i]) { 
     this.playerMinions[o] = PlayerCombatMinion(partySlots[i]); 
     o++; 
    } 
    } 
    this.currentPlayerMinion = this.playerMinions[0]; 

    $.ajax({ 
     url: "./api/generateEnemyCombatMinions.php", 
     cache: false 
    }) 
    .done(function(html) {   
     var response = html.split(":::"); 
     for(var i = 0; i < response.length; i++) { 
     var enemyMinionInfo = response[i].split("::"); 
     this.enemyMinions[i] = new EnemyCombatMinion(new Minion(enemyMinionInfo[0], 0, enemyMinionInfo[1], enemyMinionInfo[2], enemyMinionInfo[3], 0, 0, 0, 0, 0, 0)); 
     } 
     alert(this.enemyMinions.length); 
    }); 

} 

正如你看到的,我宣布this.enemyMinons在类的构造文字,并试图定义初始化方法中的值。

+0

是'var enemyMinionInfo = response [i] .split(“::”);'返回一个数组? –

+3

你的问题是'this'不是你想象的那样。 –

+0

检查“this”出来,它可能不是你认为 – MJB

回答

5

done()回调不会使用您的Combat对象作为this。保存一个指向initialize()函数中的对象的指针,以便稍后可以访问该对象。

Combat.prototype.initialize = function() { 
    var o = 0; 
    for(var i = 0; i < partySlots.length; i++) { 
    if(partySlots[i]) { 
     this.playerMinions[o] = PlayerCombatMinion(partySlots[i]); 
     o++; 
    } 
    } 
    this.currentPlayerMinion = this.playerMinions[0]; 

    // this is new 
    var that= this; 

    $.ajax({ 
     url: "./api/generateEnemyCombatMinions.php", 
     cache: false 
    }) 
    .done(function(html) {   
     var response = html.split(":::"); 
     for(var i = 0; i < response.length; i++) { 
     var enemyMinionInfo = response[i].split("::"); 
     // use "that" here instead of "this" 
     that.enemyMinions[i] = new EnemyCombatMinion(new Minion(enemyMinionInfo[0], 0, enemyMinionInfo[1], enemyMinionInfo[2], enemyMinionInfo[3], 0, 0, 0, 0, 0, 0)); 
     } 
     alert(that.enemyMinions.length); 
    }); 

} 
+0

加上这个:“this”不是java这个,这意味着它不是调用者而是“范围”。阅读范围,这是了解js最重要的方面之一。简而言之,在JS函数中创建范围,因此在done-callback内部,这是回调的范围。 – MJB

+0

非常感谢Sirko和DatProgram ..我对JS很新奇,好吧,我已经习惯了一段时间,但对于非常小的事情。我创建一个项目,主要是基于JavaScript的(除了我使用Ajax的一些MySQL的东西),以更好地理解JavaScript。我一定会在javascript中查看更多关于这些作用域的内容。 –

相关问题