2013-11-01 166 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中查看更多關於這些作用域的內容。 –

相關問題