Javascript jQuery.each()中的SetInterval

Javascript jQuery.each()中的SetInterval,javascript,jquery,function,Javascript,Jquery,Function,我希望迭代一组div,并在随机时间执行一些随机操作。我试图使用以下函数,但每次迭代时,console.log都返回相同的对象和整数。执行以下操作的正确方法是什么 $('.cloud').each(function() { $cloud = $(this); ranNum = Math.floor(Math.random() * 5000); setInterval(function() { setTimeout("console.log($clou

我希望迭代一组div,并在随机时间执行一些随机操作。我试图使用以下函数,但每次迭代时,
console.log
都返回相同的对象和整数。执行以下操作的正确方法是什么

    $('.cloud').each(function() {
    $cloud = $(this);
    ranNum = Math.floor(Math.random() * 5000);
    setInterval(function() {
        setTimeout("console.log($cloud + ranNum)", ranNum)
    })
})          
通过使用
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

我也不明白为什么要使用间隔和超时?使用一个。可能是间隔,因为您希望重复执行某些操作。

切勿将字符串用作第一个setInterval/setTimeout参数

$('.cloud').each(function () {
    var $cloud = $(this);
    var ranNum = Math.floor(Math.random() * 5000);
    setTimeout(function () {
        console.log($cloud, ranNum);
    }, ranNum);
});

您的函数有一些地方出错,因此我将在下面重写并解释:

$('.cloud').each(function(i,d) {
    var cloud = $(this);
    var randNum = Math.floor(Math.random() * 5000);

    setTimeout(function(){
        console.log(cloud + ranNum)
    }, randNum );
});
我不明白为什么您试图输出
cloud
变量,因为这只会显示HtmleElement或类似内容。另外,您试图在一个间隔内放置一个计时器,两者都是相同的,但间隔将继续循环,计时器将输出一次

如果您试图输出所引用的云数。使用
i
而不是
cloud

尝试将变量定义得更清晰一点,这不是PHP,不要使用$,不要忘记初始定义和变量的var;结束声明


希望这有帮助。

这里有很好的答案。我将添加这一点,因为您没有声明ranNum,它最终将成为一个全局变量,循环的每次迭代都将覆盖以前的值,而不是创建一个新变量。因此,您在日志输出中看到的数字将始终是在循环的最后一次迭代期间生成的任意随机值


所以,始终声明您的变量

在jQuery对象前面加上
$
前缀有点常见-这是完全有效的。然而,我只会对
var$this=$(this)这样做
并且不要在其他jQuery对象前面加上
$
@ThiefMaster:this对
$this
完全有效是的,其他的一切都会让人分心,因为你开始到处看到jQuery选择器。我想使用$是有理由的。尽管jQuery本质上是匈牙利语,但它引入了一个表示一个或多个DOM元素的对象,许多函数可以接受DOM元素或jQuery对象。无论您使用的是DOM元素还是jQuery对象,都很容易混淆,因为它们有时(但并不总是)是可互换的,而且您经常在它们之间来回转换。此约定可以帮助您避免由此产生的错误。为什么设置间隔?你甚至没有指定一个超时!这就成功了。我最初宣布它们是全球性的,但没有提到这个问题。谢谢大家!@不客气。谢谢你接受我的回答。