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