2016-10-15 69 views
0

我使用JavaScript在網站上顯示二進制時鐘。首次加載站點時,需要將時鐘設置爲正確的時間,然後進行更新。在第一次方法調用時執行所有if-bodies的正確方法

什麼是正確的方式來得到這種行爲?現在我有一個var在每次更新時被檢查並在第一次運行後設置爲false。

複製函數,刪除條件並調用其他函數會更好嗎?

這是函數:

time.firstRun = true; 

function updateBinaryClock() { 
var now = moment().toObject(); 

var bin; 
if (time.showClockWithSeconds) { 
    bin = toSixBit(now.seconds.toString(2)); 
    setColor(".binSec", bin); 
} 
if (now.seconds == 0 || time.firstRun) { 
    bin = toSixBit(now.minutes.toString(2)); 
    setColor(".binMin", bin); 
} 
if (now.minutes == 0 || time.firstRun) { 
    bin = toSixBit(now.hours.toString(2)); 
    setColor(".binHour", bin); 
} 
if (time.firstRun) { 
    time.firstRun = false; 
} 

setTimeout(updateBinaryClock, 0.1 * 1000); 
} 
+0

我想補充一個參數:'函數updateBinaryClock (firstRun){...}',並且第一次調用它:'updateBinaryClock(true);'。然後,當它被'setTimeout'調用時,該參數將不再存在。 – blex

回答

2

你的函數很快就會飽和你的內存,因爲你忘記清除每個函數執行的超時。 你可以使用的setInterval,而不是setTimeout的:

function updateBinaryClock() { 
    aux_updateBinaryClock(true); 
    setInterval(aux_updateBinaryClock, 100); // 0.1*1000 
} 

function aux_updateBinaryClock(isFirstRun) { 
    var now = moment().toObject(), 
     bin; 

    if (time.showClockWithSeconds) { 
     bin = toSixBit(now.seconds.toString(2)); 
     setColor(".binSec", bin); 
    } 
    if (now.seconds === 0 || isFirstRun) { 
     bin = toSixBit(now.minutes.toString(2)); 
     setColor(".binMin", bin); 
    } 
    if (now.minutes === 0 || isFirstRun) { 
     bin = toSixBit(now.hours.toString(2)); 
     setColor(".binHour", bin); 
    } 

} 

updateBinaryClock(); 

還要注意的是setInterval and setTimeout are inaccurate,還有的setInterval和setTimeout的許多更準確的實現(ES thisthis。)

+0

謝謝,這非常有幫助。我已經注意到內存泄漏,但不知道在哪裏尋找它。 – user3768649

0

我會做的是將其分成兩個功能。

function initBinaryClock() { 

} 
function updateBinaryClock() { 

    requestAnimationFrame(updateBinaryClock); 
} 

window.addEventListener("load", function loader(){ 
    window.removeEventListener("load", loader, false); 
    initBinaryClock(); 
    updateBinaryClock(); 
}, false); 
相關問題