關於js物件中兩個函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)附帶無縫輪播圖程式碼
阿新 • • 發佈:2018-11-19
先上之前的錯誤程式碼吧,注意計時器這個方法(是想把之前寫的的輪播圖演示重構一下)
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就可以了。
這種寫法方便管理程式碼,不過還是需要謹慎使用。後續還需要深入學習才能避免在簡單事情上經常犯錯。