Javascript jQuery-setInterval问题
我正在使用jQuery生成一个随机数量的云,并将其添加到页面的页眉中,然后在指定的时间间隔内将其向左移动。一切正常,execpt每个云只运行一次间隔,不会再次运行。这是我的密码: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++) {
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是你的,因为它已经过时了。谢谢你的解释,它真的帮助我理解了更多!谢谢你的解释,它真的帮助我了解更多!