着名的物理学,未捕获的TypeError

时间:2015-04-28 13:18:12

标签: javascript famo.us

以下代码会生成此错误:

  

未捕获的TypeError:无法读取属性' 5'未定义的

这是由以下代码的第52行引发的。当两个循环设置为停止在4时,我不明白行或列的值如何变为5。

感谢您的帮助。

//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]);
        }
    }

});

2 个答案:

答案 0 :(得分:0)

创建转换函数,但不在此阶段执行。

当调用transform函数时,计数器确实是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...

如果您现在调用其中一项功能,则rows的值为5

以下是问题的简短示例:

&#13;
&#13;
var functionList = [];

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

functionList[0]();
&#13;
&#13;
&#13;

答案 1 :(得分: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();
        }