我想我錯過了一些關於JavaScript中對象和原型函數的關鍵概念。爲什麼通過setTimeout調用原型函數時會丟失實例信息?
我有以下:
function Bouncer(ctx, numBalls) {
this.ctx = ctx;
this.numBalls = numBalls;
this.balls = undefined;
}
Bouncer.prototype.init = function() {
var randBalls = [];
for(var i = 0; i < this.numBalls; i++) {
var x = Math.floor(Math.random()*400+1);
var y = Math.floor(Math.random()*400+1);
var r = Math.floor(Math.random()*10+5);
randBalls.push(new Ball(x, y, 15, "#FF0000"));
}
this.balls = randBalls;
this.step();
}
Bouncer.prototype.render = function() {
this.ctx.clearRect(0, 0, 400, 400);
for(var i = 0; i < this.balls.length; i++) {
this.balls[i].render(this.ctx);
}
}
Bouncer.prototype.step = function() {
for(var i = 0; i < this.balls.length; i++) {
this.balls[i].yPos -= 1;
}
this.render();
setTimeout(this.step, 1000);
}
我然後創建蹦牀的一個實例,並調用它的init函數,如下所示:
$(function() {
var ctx = $('#canvas')[0].getContext('2d');
var width = $('#canvas').width();
var height = $('#canvas').height();
var bouncer = new Bouncer(ctx, 30);
bouncer.init();
});
的init()函數將調用步驟,其具有的setTimeout循環步進功能。
這適用於第一次調用step()。但是,在第二次調用時(setTimeout觸發一步時),實例變量「balls」未定義。所以,在我的step函數中,第二個調用會爆炸說沒有未定義的「length」屬性。
爲什麼從setTimeout()調用步驟時會丟失實例信息?
我怎麼能重組這個,所以我可以通過超時循環,仍然可以訪問這些實例變量?
擊敗了我20秒,並以一個整潔的例子來啓動。做得好。 – Beejamin