javascript setInterval在对数组对象进行调用时给出错误

时间:2018-11-25 02:07:37

标签: javascript setinterval

我正在用JavaScript创建游戏。当用户单击向上箭头时,它将发射导弹。用户应该能够单击UP箭头,并且每次单击都应该发射一枚新导弹。我有一个“导弹”对象和一个“导弹”数组。导弹物体具有发射功能。

下面的行在setInterval中使用时给我一个错误。当我注释掉setInterval时,它没有问题。

错误消息:game.js:21

  

未捕获到的TypeError:无法读取game.js:21中未定义的属性“样式”

错误行:this.image.style.left=this.leftPos+'px';

var missile = {
    leftPos: 0,
    bottomPos: 0,
    image: null,
    id: null,
    launch: function () {
        setInterval(function () {
            this.image.style.left = this.leftPos + 'px';
            this.image.style.bottom = this.bottomPos + 'px';
            this.leftPos += 0.5;
            this.bottomPos += 1;
        }, 10);
    }
}; 

在某个地方,我称之为:     currMissile = missiles [missiles.length-1];     currMissile.launch();

1 个答案:

答案 0 :(得分:0)

此上下文未引用对象""" # snippet for testing <class:Sample> """ from flask import Flask app = Flask(__name__) app.config.from_mapping( SQLALCHEMY_ECHO=True, SQLALCHEMY_TRACK_MODIFICATIONS=False, SQLALCHEMY_DATABASE_URI='sqlite:///test_orm.sqlite.db', ) db.init_app(app=app) db.app = app db.create_all() d1 = dict( tags='["python2","flask"]', models='["m1"]' ) m1 = Sample(**d1) print(1111, type(m1.tags), m1.tags) m1.save() print(1112, type(m1.tags), m1.tags) dm1 = Sample.query.filter(Sample.id == m1.id).all()[0] print(1113, dm1, type(dm1.tags), dm1.tags) ## fixme[Q1] !!! ## if not continue with $d2, it won't raise error of UPDATE $d1 d2 = dict( tags='["python3","flask"]', models='["m2", "m3"]' ) m2 = Sample(**d2) print(2221, type(m2.tags), m2.tags) ## fixme[Q1] !!! # db.session.close() ## If session was not closed, error raise here. m2.save() print(2222, type(m2.tags), m2.tags) dm2 = Sample.query.filter(Sample.id == m2.id).all()[0] print(2223, dm2, type(dm2.tags), dm2.tags) ,此外,我可以看到您多次用同一对象填充数组,这意味着该数组中的所有索引都指向同一对象,依靠错误。

每当用户按下UP键时,您应该实例化一个新对象

例如

missile
var Missile = function() {
  this.leftPos = 0;
  this.bottomPos = 0;
  this.image = { // Example
    style: {
      left: 4,
      bottom: 34
    }
  };
  this.id = null;
  this.launch = function() {
    setInterval(() => { // Use arrow function to get access to Missile lexical context.
      this.image.style.left = this.leftPos + 'px';
      this.image.style.bottom = this.bottomPos + 'px';
      this.leftPos += 0.5;
      this.bottomPos += 1;
      console.log(this.image.style.left);
    }, 500);
  };
};

new Missile().launch();