2017-09-25 97 views
0

我有以下的循環,我想優化:如何優化取模功能?

var items = document.querySelectorAll('.mover'); 

for (var i = 0; i < items.length; i++) { 
    var phase = Math.sin((document.body.scrollTop/1250) + (i % 5)); 
    items[i].style.left = items[i].basicLeft + 100 * phase + 'px'; 
} 

當我控制檯登錄相輸出。 console.log(phase)我意識到,我得到了相同的5個號碼。

例如: 比方說items.length = 200。 這些是階段的結果。

i = 0 phase = 0 
i = 1 phase = 0.84147 
i = 2 phase = 0.90929 
i = 3 phase = 0.14112 
i = 4 phase = -0.75680 
i = 5 phase = 0 
i = 6 phase = 0.84147 
i = 7 phase = 0.90929 
i = 8 phase = 0.14112 
i = 9 phase = -0.75680 
i = 10 phase = 0 
i = 11 phase = 0.84147 
i = 12 phase = 0.90929 
i = 13 phase = 0.14112 
i = 14 phase = -0.75680 

我想借此行

var phase = Math.sin(var scrollTop = document.body.scrollTop/1250; + (i % 5)); 

出來的for循環,但我無法弄清楚如何通過正確的相位數迴圈。

所以我只是想計算我的< 5階段,因爲它之後重複。如何使它相對應,以便當for循環處於i = 25時,循環獲得正確的相位(在這種情況下,它將爲0)。

+0

有[沒什麼優化]在該代碼(https://en.wikipedia.org/wiki/Premature_optimisation)。就這樣離開吧。 – Bergi

+0

a)使用嵌套循環(一個從0到5,一個在增量爲5的元素上)b)使用大小爲5的數組來記憶值 – Bergi

回答

1

將5個值的結果存儲到臨時數組中。

然後與5的模數,應該給你相同的結果。

有一件事我會說,要知道在JavaScript中優化,有時你可能會認爲你做事快,但實際上可能不是。例如。 Chromes V8引擎甚至可能檢測到這種模式。 JIT編譯器最近做了一些聰明的事情。

var 
 
    items = Array(10), 
 
    modvar = [], 
 
    i; 
 
    
 
for (i = 0; i < 5; i++) modvar[i] = 
 
    Math.sin((document.body.scrollTop/1250) + (i % 5)); 
 

 
for (i = 0; i < items.length; i++) { 
 
    var phase = modvar[i%5]; 
 
    console.log(`i = ${i} phase = ${phase}`); 
 
}