超时和javascript

超时和javascript,javascript,jquery,html,Javascript,Jquery,Html,我想在页面加载时生成4个圆圈。然而,即使函数被调用了4次,我也只看到一次。我想知道我错过了什么。是因为当函数完成时,它启动的所有超时都被清除了吗 function getRandom(min, max) { return Math.floor((Math.random()*max)+min); } function generateCircle(leftPos, topPos, zIndex) { $circle = $('<div class="cercleAnime

我想在页面加载时生成4个圆圈。然而,即使函数被调用了4次,我也只看到一次。我想知道我错过了什么。是因为当函数完成时,它启动的所有超时都被清除了吗

function getRandom(min, max) {
    return Math.floor((Math.random()*max)+min);
}

function generateCircle(leftPos, topPos, zIndex) {

    $circle = $('<div class="cercleAnime"></div>');
    $('body').append($circle);
    var self = this;

    self.leftPos = leftPos;
    self.topPos = topPos;

    $circle.css({
        'left' : self.leftPos+'px',
        'top' : self.topPos+'px',
        'z-index' : zIndex
    });

    $circle.animate({'width' : '300px', 'height' : '300px'}, {
        duration : 5000,
        progress: function() {
            newLeft = self.leftPos - $(this).width()/2;
            newTop = self.topPos - $(this).height()/2;

            $(this).css({
                'left' : newLeft+'px',
                'top' : newTop+'px'
            })
        },
        done: function() {
            $(this).remove()
        }
    } );

}


function generateCircles(numberOfCircles, intervalBetweenCircles) {
    leftPos = getRandom(1,1000);
    topPos = getRandom(100,400);
    zIndex = 1000;
    timeoutTime = intervalBetweenCircles;

    for(var i = 0; i < numberOfCircles; i++) {
        zIndex--;
        setTimeout(function(){generateCircle(leftPos, topPos, zIndex)}, timeoutTime);
        timeoutTime += intervalBetweenCircles;
    }

}



$(function() {
    generateCircles(3, 2000);

    generateCircles(3, 2000);

    generateCircles(3, 2000);

    generateCircles(3, 2000);




});
函数getRandom(最小值、最大值){ 返回Math.floor((Math.random()*max)+min); } 函数生成器循环(leftPos、topPos、zIndex){ $circle=$(''); $('body')。追加($circle); var self=这个; self.leftPos=leftPos; self.topPos=topPos; $circle.css({ 'left':self.leftPos+'px', 'top':self.topPos+'px', “z索引”:zIndex }); $circle.animate({'width':'300px','height':'300px'){ 持续时间:5000, 进展:职能(){ newLeft=self.leftPos-$(this).width()/2; newTop=self.topPos-$(this).height()/2; $(this.css)({ 'left':newLeft+'px', “顶部”:newTop+“px” }) }, 完成:函数(){ $(this.remove()) } } ); } 函数生成圈(圈数、圈间间隔){ leftPos=getRandom(11000); topPos=getRandom(100400); zIndex=1000; timeoutTime=圆圈之间的间隔; 对于(变量i=0;i
下面是一个JSFIDLE:

您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)

这是因为
generateCorcles
中的
leftPos
topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,
setTimeout
回调将“在将来的某个时候”运行

一种解决方案是使用局部变量,以便将它们绑定到闭包中:


(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)

您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)

这是因为
generateCorcles
中的
leftPos
topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,
setTimeout
回调将“在将来的某个时候”运行

一种解决方案是使用局部变量,以便将它们绑定到闭包中:


(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)

您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)

这是因为
generateCorcles
中的
leftPos
topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,
setTimeout
回调将“在将来的某个时候”运行

一种解决方案是使用局部变量,以便将它们绑定到闭包中:


(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。这就是闭包成为闭包的原因。)

您正在绘制具有相同特征的圆4次。(它们很好地堆叠在一起,并隐藏以前的圆圈。)

这是因为
generateCorcles
中的
leftPos
topPos
(etc)是全局变量,在第一个圆绘制之前被覆盖。请记住,
setTimeout
回调将“在将来的某个时候”运行

一种解决方案是使用局部变量,以便将它们绑定到闭包中:

(作用域中的闭包,即传递给
setTimeout
的函数仍然可以访问这些局部变量。毕竟,这就是闭包成为闭包的原因。)

var leftPos = getRandom(1,1000);
var topPos = getRandom(100,400);
// etc