Javascript jQuery-setInterval问题

Javascript jQuery-setInterval问题,javascript,jquery,Javascript,Jquery,我正在使用jQuery生成一个随机数量的云,并将其添加到页面的页眉中,然后在指定的时间间隔内将其向左移动。一切正常,execpt每个云只运行一次间隔,不会再次运行。这是我的密码: if(enableClouds) { var cloudCount = Math.floor(Math.random() * 11); // Random Number between 1 & 10 for(cnt = 0; cnt < cloudCount; cnt++) {

我正在使用jQuery生成一个随机数量的云,并将其添加到页面的页眉中,然后在指定的时间间隔内将其向左移动。一切正常,execpt每个云只运行一次间隔,不会再次运行。这是我的密码:

if(enableClouds) {
    var cloudCount = Math.floor(Math.random() * 11); // Random Number between 1 & 10

    for(cnt = 0; cnt < cloudCount; cnt++) {
        var cloudNumber = Math.floor(Math.random() * 4);
        var headerHeight = $('header').height() / 2;
        var cloudLeft = Math.floor(Math.random() * docWidth);
        var cloudTop = 0;
        var thisHeight = 0;
        var cloudType = "one";

        if(cloudNumber == 2) {
            cloudType = "two";
        }else if(cloudNumber == 3) {
            cloudType = "three";
        }

        $('header').append('<div id="cloud' + cnt + '" class="cloud ' + cloudType + '"></div>');

        thisHeight = $('#cloud' + cnt).height();
        headerHeight -= thisHeight;
        cloudTop = Math.floor(Math.random() * headerHeight);

        $('#cloud' + cnt).css({
            'left' : cloudLeft,
            'top' : cloudTop
        });

        setInterval(moveCloud(cnt), 100);
    }

    function moveCloud(cloud) {
        var thisLeft = $('#cloud' + cloud).css('left');

        alert(thisLeft);
    }
}
if(启用云){
var cloudCount=Math.floor(Math.random()*11);//1和10之间的随机数
对于(cnt=0;cnt
感谢您的帮助

这是一条路:

 setInterval((function(i){
      return function(){
         moveCloud(i);
      };
 })(cnt), 100);
这是一条路:

 setInterval((function(i){
      return function(){
         moveCloud(i);
      };
 })(cnt), 100);

工程师给了你需要的代码。下面是正在发生的事情

setInterval
函数接受函数对象和间隔。函数对象只是一个可以调用的对象,如下所示:

/* Create it */
var func = function() { /* ... blah ... */};

/* Call it */
var returnVal =  func(parameters)
这里的对象是
func
。如果你调用它,你得到的是返回值

因此,在您的代码中:

setInterval(moveCloud(cnt), 100);
您正在输入调用的返回值
moveCloud(cnt)
,而不是函数对象
moveCloud
。所以那个钻头坏了

不正确的实施将是:

for(cnt = 0; cnt < cloudCount; cnt++) {
    /* ... other stuff ... */
    var interval = setInterval(function() {
       moveCloud(cnt);
    }, 100);
}
它使用一个返回函数的“立即函数”。您可以创建一个函数:

function(i){
    return function(){
        moveCloud(i);
    };
}
它返回另一个函数(我们称之为
outer
),当使用值
i
调用该函数时,将使用该值调用
moveCloud
。 然后,我们立即使用值
cnt
调用
outer
。这为我们提供了一个函数,当调用该函数时,无论此时
cnt
的值是多少,它都会使用调用
moveCloud
。这正是我们想要的


这就是我们这样做的原因。

工程师为您提供了所需的代码。下面是正在发生的事情

setInterval
函数接受函数对象和间隔。函数对象只是一个可以调用的对象,如下所示:

/* Create it */
var func = function() { /* ... blah ... */};

/* Call it */
var returnVal =  func(parameters)
这里的对象是
func
。如果你调用它,你得到的是返回值

因此,在您的代码中:

setInterval(moveCloud(cnt), 100);
您正在输入调用的返回值
moveCloud(cnt)
,而不是函数对象
moveCloud
。所以那个钻头坏了

不正确的实施将是:

for(cnt = 0; cnt < cloudCount; cnt++) {
    /* ... other stuff ... */
    var interval = setInterval(function() {
       moveCloud(cnt);
    }, 100);
}
它使用一个返回函数的“立即函数”。您可以创建一个函数:

function(i){
    return function(){
        moveCloud(i);
    };
}
它返回另一个函数(我们称之为
outer
),当使用值
i
调用该函数时,将使用该值调用
moveCloud
。 然后,我们立即使用值
cnt
调用
outer
。这为我们提供了一个函数,当调用该函数时,无论此时
cnt
的值是多少,它都会使用调用
moveCloud
。这正是我们想要的


这就是我们这样做的原因。

为了清晰起见,我建议将内部
cnt
s更改为其他内容(以便清楚地知道哪个是哪个)。但是,是的,这是通往成功的道路go@Dancrumb我认为你是对的,值得考虑一下
js新手
s;)@工程师:是的,这实际上是一些非常高级的JS东西。。。我在下面的回答中添加了一个解释,但是+1是你的,因为它完全正确。为了清楚起见,我建议将内部
cnt
s更改为其他内容(以便清楚地知道哪个是哪个)。但是,是的,这是通往成功的道路go@Dancrumb我认为你是对的,值得考虑一下
js新手
s;)@工程师:是的,这实际上是一些非常高级的JS东西。。。我在下面的答案中添加了一个解释,但是+1是你的,因为它已经过时了。谢谢你的解释,它真的帮助我理解了更多!谢谢你的解释,它真的帮助我了解更多!