2015-04-28 32 views
0

下面的代碼生成此錯誤:著名物理,遺漏的類型錯誤

Uncaught TypeError: Cannot read property '5' of undefined

這通過下面的代碼的行52拋出。我不明白行或列的值如何達到5,當兩個循環設置爲停止在4.

感謝您的任何幫助。

//globals define 
define(function(require, exports, module) { 
    'use strict'; 
    // import dependencies 
    var Engine = require('famous/core/Engine'); 
    var Surface = require('famous/core/Surface') 
    var Modifier = require('famous/core/Modifier'); 
    var PhysicsEngine = require('famous/physics/PhysicsEngine'); 
    var Particle = require('famous/physics/bodies/Particle'); 
    var Drag = require('famous/physics/forces/Drag'); 
    var RepulsionForce = require('famous/physics/forces/Repulsion') 

    var positionsArray = [-140,-70,0,70,140]; 

    var context = Engine.createContext(); 

    var physics = new PhysicsEngine(); 

    var planetParticle = new Particle({ 
     position:[0,0,0] 
    }); 

    physics.addBody(planetParticle); 

    var gridItem = []; 
    var gridItemParticle = []; 
    var gridItemModifier = []; 


    for (var rows = 0; rows < 5; rows += 1){ 
     gridItem[rows] = []; 
     gridItemParticle[rows] = []; 
     gridItemModifier[rows] = []; 
     for (var cols = 0; cols < 5; cols += 1){ 
      gridItem [rows][cols] = new Surface({ 
      properties: { 
       backgroundColor: '#23AD23' 
      } 
      }); 

      gridItemParticle[rows][cols] = new Particle({ 
      position: [positionsArray[rows], positionsArray[cols], 0] 
      }); 

      physics.addBody(gridItemParticle[rows][cols]); 

      gridItemModifier[rows][cols] = new Modifier({ 
      size: [50,50], 
      align: [0.5, 0.5], 
      origin: [0.5, 0.5], 

      //---------------------This is the line that throws the error 
      transform: function() { 
      return gridItemParticle[rows][cols].getTransform(); 
      } 
      }); 

      context.add(gridItemModifier[rows][cols]).add(gridItem[rows][cols]); 
     } 
    } 

}); 
+0

調試代碼,一步一步 – 2015-04-28 13:21:32

回答

0

這是不是一個真正的Famo.us Physics問題。這是一個問題,你如何試圖將一個調用綁定到你的函數。最佳做法是不要在循環中創建匿名函數。

rowscols的值需要綁定到您的函數供以後使用。

 //---------------------This is the line that throws the error 
     transform: function() { 
     return gridItemParticle[rows][cols].getTransform(); 
     } 

可改爲

 //--------------------- bind your values 
     transform: gridItemTrans.bind({row: rows, col: cols}) 

創建循環

 function gridItemTrans() { 
      return gridItemParticle[this.row][this.col].getTransform(); 
     } 
+0

堆感謝您的幫助之外的功能;現在所有的作品。如果我正確理解了原理,將循環計數器的值作爲參數傳遞給單獨的函數會保留它們,因爲它們被包含在該函數的作用域中,而循環的變量位於全局範圍內。 – Timbo

+0

是的,每個變量聲明對於循環來說都不是本地的,就像在其他語言中一樣,但它與循環本身具有相同的範圍。這就是爲什麼你必須將該值綁定到函數的調用,因爲變量的值在每次迭代中都會改變。因此,每次調用都使用變量的最後一個值。 – talves

0

轉換函數已創建,但在此階段未執行。

到變換函數被調用時,計數器確實是5,這就是循環退出的原因。

例子:

rows = 0 - Loops (adds a transform function) 
rows = 1 - Loops (adds a transform function) 
rows = 2 - Loops (adds a transform function) 
rows = 3 - Loops (adds a transform function) 
rows = 4 - Loops (adds a transform function) 
rows = 5 - Exits loop... 

如果現在調用這些函數之一,rows5

這是問題的一個簡單的例子:

var functionList = []; 
 

 
for (var i = 0; i < 5; i++) { 
 
    functionList.push(function() { 
 
     alert(i); 
 
    }); 
 
} 
 

 
functionList[0]();