setInterval(fn,t);裏的fn中,要使用外部類的this,則須要先將this保存起來,再使用保存的this,不能直接使用this,裏面的this是指向window對象,記住setInterval()其實是window.setInterval()就明白了。this
//這是Hero類中的一個方法 Hero.prototype.shotEnemy=function(){ switch(this.direct){ case 0: var bullet=new Bullet(this.x+9,this.y,this.direct); //建立子彈;子彈的座標和方向與tank一致 break; case 1: var bullet=new Bullet(this.x+30,this.y+9,this.direct); break; case 2: var bullet=new Bullet(this.x+9,this.y+30,this.direct); break; case 3: var bullet=new Bullet(this.x,this.y+9,this.direct); break; } this.heroBullet.push(bullet); heroBullet=this.heroBullet; //須要保存下來供下面的setInterval()使用,setInterval()屬於window對象,裏面的this指向window,因此不能使用this.heroBullet heroBullet[heroBullet.length-1].t_run=setInterval("heroBullet["+(heroBullet.length-1)+"].run()",50); //這裏setInterval()裏的第一個參數必須使用這種寫法,下面兩種寫法都不行;;這裏的代碼實際上會生成setInterval("heroBullet[0].run()",50)這樣固定下標的格式,因此會一直執行相應的對象,而下面的每次都要運算heroBullet.length-1,因此當發射多個子彈的時候,定時器總會改變爲執行最後一個對象,也就會形成定時器累積致使子彈愈來愈快的問題 // heroBullet[heroBullet.length-1].t_run=setInterval("heroBullet[heroBullet.length-1].run()",50); // heroBullet[heroBullet.length-1].t_run=setInterval(function(){ // heroBullet[heroBullet.length-1].run(); // },50); }
var a=[]; var i=0; function test(){ a.push(i++); setTimeout("console.log(a["+(a.length-1)+"])",100); //輸出12345 // setTimeout("console.log(a[a.length-1])",100); //輸出5個5 } test() test() test() test() test()