我希望迭代一组div并随机执行一些随机操作。我试图使用以下函数,但console.log
在每次迭代时返回相同的对象和整数。执行以下操作的正确方法是什么?
$('.cloud').each(function() {
$cloud = $(this);
ranNum = Math.floor(Math.random() * 5000);
setInterval(function() {
setTimeout("console.log($cloud + ranNum)", ranNum)
})
})
答案 0 :(得分:9)
var
因为您提供的功能是字符串,所以您必须使用全局变量。您的代码应该使用在事件匿名函数闭包中定义的局部变量编写,如下所示:
$('.cloud').each(function() {
var $cloud = $(this);
var ranNum = Math.floor(Math.random() * 5000);
setInterval(function() {
// $cloud won't have any particular meaning though
console.log($cloud + ranNum);
}, ranNum);
});
setInterval
和setTimeout
此外,我没有看到你使用间隔和超时的原因?用一个。可能是间隔,因为你想要重复执行某些东西。
答案 1 :(得分:1)
请.. 永远不要使用字符串作为第一个setInterval / setTimeout参数
$('.cloud').each(function () {
var $cloud = $(this);
var ranNum = Math.floor(Math.random() * 5000);
setTimeout(function () {
console.log($cloud, ranNum);
}, ranNum);
});
答案 2 :(得分:1)
你的功能有些问题,所以我将在以后重写和解释:
$('.cloud').each(function(i,d) {
var cloud = $(this);
var randNum = Math.floor(Math.random() * 5000);
setTimeout(function(){
console.log(cloud + ranNum)
}, randNum );
});
我不明白你为什么要输出cloud
变量,因为这只会显示HTMLElement或类似的变量。此外,你试图在一个间隔内放一个计时器,两者都是相同的,但是间隔将保持循环,计时器将输出一次。
如果您要输出正在引用的数字云。使用i
代替cloud
。
尝试更清楚地定义你的变量,这不是PHP,不要使用$并且不要忘记初始定义的var;结束陈述!
希望这会有所帮助。
答案 3 :(得分:0)
这里有很好的答案。我将补充一点,因为你没有声明ranNum它最终成为一个全局变量,并且循环的每次迭代都将覆盖先前的值而不是创建一个新变量。因此,您在日志输出中看到的数字将始终是在循环的最后一次迭代期间生成的任何随机值。
所以,总是声明你的变量!