如何使用模数优化函数?

时间:2017-09-25 21:00:28

标签: javascript for-loop optimization modulo

我有以下要优化的循环:

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循环,但我无法弄清如何将正确的相位数传回循环。

所以我只想计算i的相位&lt; 5,因为它在那之后重复。如何使其对应,以便当for循环在i = 25时,循环得到正确的相位(在这种情况下它将为0)。

1 个答案:

答案 0 :(得分: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}`);
}