2017-09-25 98 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}`); 
 
}