使用 setTimeout 将正确的项目传递给其他函数时出现问题

发布于 2024-09-05 01:27:49 字数 343 浏览 5 评论 0原文

我的问题是:

var slide;
$$('#slides li').each(function(i, n) {
    slide = i;
    setTimeout("initiateSlide()",n * 500)                     
});
function initiateSlide(){
    i = slide;
    alert(i); // pretty much alerts the last one 5 times
}

我希望 initiateSlide() 使用 5 张不同的幻灯片,但我只获得最后一张幻灯片 5 次。

Here's my problem:

var slide;
$('#slides li').each(function(i, n) {
    slide = i;
    setTimeout("initiateSlide()",n * 500)                     
});
function initiateSlide(){
    i = slide;
    alert(i); // pretty much alerts the last one 5 times
}

I expect to initiateSlide() with 5 different slides, instead I only get the last one 5 times.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江湖彼岸 2024-09-12 01:27:49

您的问题是,您在 initiateSlide() 函数中引用的全局变量(幻灯片)在函数运行时设置为最后一个变量。您可能想使用闭包来维护变量的状态。像这样:

$('#slides li').each(function(i, n) {
    setTimeout(function() { initiateSlide(i); }, n * 500)
});
function initiateSlide(i){
    alert(i);
}

注意 - 这也完全消除了对全局的需要

Your problem is that the global variable (slide) that you are referencing in the initiateSlide() function is set to the last one by the time the function runs. You probably want to use closures to maintain the state of the variable. Like this:

$('#slides li').each(function(i, n) {
    setTimeout(function() { initiateSlide(i); }, n * 500)
});
function initiateSlide(i){
    alert(i);
}

Note - This also removes the need for the global entirely

眉目亦如画i 2024-09-12 01:27:49

我建议您摆脱全局变量,并将循环中的每张幻灯片作为参数传递给 initiateSlide 函数:

$('#slides li').each(function(slide, n) {
  setTimeout(function () {
    initiateSlide(slide);
  }, n * 500)                     
});

function initiateSlide(slide){
  alert(slide);
}​

在您的示例中,each 循环在任何 < code>setTimeout 回调已执行,您的 initiateSlide 函数正在使用最后一个迭代元素调用。

I recommend you to get rid of the global variables and pass each slide within the loop as an argument to your initiateSlide function:

$('#slides li').each(function(slide, n) {
  setTimeout(function () {
    initiateSlide(slide);
  }, n * 500)                     
});

function initiateSlide(slide){
  alert(slide);
}​

In your example, the each loop ended before any setTimeout callback was executed, your initiateSlide function was being invoked using the last iterated element.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文