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

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

先上之前的錯誤程式碼吧,注意計時器這個方法(是想把之前寫的的輪播圖演示重構一下)

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

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

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