【发布时间】:2015-03-01 03:12:46
【问题描述】:
所以,我创建了一个容器 div,在该 div 内我有一个脚本动态创建 113 个 div,类名为“fragment”。现在,一切都井井有条,我特意将这 113 个 div 做得非常小,大约 5X5 像素。然后我把它们放在容器里,让它们拼出一个标题。所有的 div 都在一个名为 divs 的数组中。所以 divs 是一个包含 113 个元素的数组。
现在事情变得混乱了,我想让那些 div 隐藏在浏览器的不可见区域后面,我通过给“片段”绝对定位并设置它们隐藏的样式来实现这一点,例如:divs[45].style.left = -600';,之后,我创建了一个可以运行 for-loop 的脚本,并且在该 for-loop 中,我希望每个小元素在延迟后回到它的位置。但是,我不得不为此使用闭包,因为在 for 循环中插入 SetTimeout()inside 很奇怪。
for (i = 0; i < divs.length; i++)
{
(function(j)
{
setTimeout(function ()
{
divs[j].style.left = divs[j].offsetLeft + 550;
}, Math.floor(Math.random() * 1000));
})(i); //Pass current value into self-executing anonymous function
}
我无法理解上面的代码。我以为写Math.floor(Math.random() * 1000)的区域是指定延迟以ms为单位。但是,如果我输入 1000,它将一次移动所有 113 个元素。我不明白这一点,在移动到数组中的下一个元素之前不应该等待 1 秒吗?顺便说一句,代码运行良好,最终发生的事情是元素随机移动,给标题带来了非常酷的效果。闭包对我来说已经足够令人困惑了,对我来说这似乎是一种非常奇怪的行为。
有人能解释一下为什么会发生这种情况吗,如果我取出Math.floor(Math.random() * 1000),为什么所有元素都会立即移动,而不是简单地让一个元素每秒移动一个左右... *
编辑
我的问题不是关于闭包,而是关于为什么取出Math.floor(Math.random() * 1000) 并用“1000”替换它会导致所有元素一次移动,而不是一个一个地移动,间隔为 1000 毫秒。
【问题讨论】:
-
你需要在这里改变方法,有一个用 setTimeout 调用自身的函数......这样它会调用一次,然后等待......再次调用它并等待等等。您还可以传递一个或两个参数,例如 divs.length 和 var i;
-
Jon 已经回答了你的问题,所有的超时都一个接一个地触发,没有延迟,因为 for 循环不会等待每个超时,..
标签: javascript html arrays for-loop