關於setInterval()裏的this和細節

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()
相關文章
相關標籤/搜索