1. 程式人生 > >關於js物件中兩個函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)

關於js物件中兩個函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)

先上之前的錯誤程式碼吧(是想把之前寫的的輪播圖demo重構一下)

var obj = {
    sleepTime: 2000,//輪播延時
    cont: 0,//第幾張
    origin: document.getElementsByClassName('main-img')[0],//拿到全部圖片的父級
    init: function () {
        this.timer();
    },
    move: function (origin) {
        this.cont++;
        origin.style.transform = 'translate3d(' + this.cont * (-500) + 'px,0px,0px)';
        origin.style.transitionDuration = '1s';
        if (this.cont > 4) {
            this.cont = 0;
            origin.style.transitionDuration = '0s';
        }
    },
    timer: function () {
        timer1 = setInterval(function () {
            this.move(this.origin);
        }, this.sleepTime)
    }
}
obj.init();

    報錯資訊是這樣的:move is not a function。當即想到一個問題,就是move的宣告有問題,或者在timer中無法訪問我定義的move,實驗幾次之後才發現是this的問題,定時器定義後執行環境就不是在物件中了,this也就訪問不到move()了,那麼只需要把定時器timer中的this全部改成obj就可以了。

這種寫法方便管理程式碼,不過還是需要謹慎使用。後續還需要深入學習才能避免經常在簡單事情上經常犯錯。