jQuery中使用setTimeout实现循环定时函数不执行该如何解决?
问题原因与修复方案
你的代码存在3个核心问题,导致函数没有按预期执行:
- 你调用
setTimeout时直接写了Rotate(i),这种写法会立即执行Rotate函数,而不是把函数作为回调交给定时器触发,相当于你把Rotate执行后的返回值(这里是undefined)传给了定时器,定时器后续不会执行任何逻辑 - 初始定时器的时长设置错误:你写的
50000000毫秒换算后约等于13.9小时,自然看不到触发效果 - 函数形参
i和外层定义的计数变量i命名冲突,属于不规范写法,容易引发逻辑混乱
修正后的代码
jQuery( document ).ready(function() { var words = ["Crear","Evolucionar","Sanar","perdonar","Volver a amar","Brillar"]; var i = 0; function Rotate() { jQuery( "#fade-text" ).fadeOut( "slow", function() { jQuery( "#fade-text" ).html(words[i]) jQuery( "#fade-text" ).fadeIn( "slow" , function(){ i = i + 1 console.log(i) if(i == words.length ) i = 0; // 直接传入函数引用,等定时结束再执行 setTimeout(Rotate, 5000); }); }); } // 初始触发时长改成5000毫秒即5秒,可按需求调整 setTimeout(Rotate, 5000); });
如果需要保留把i作为参数传递的写法,也可以用如下两种形式调用定时器:
// 箭头函数包裹写法 setTimeout(() => Rotate(i), 5000); // setTimeout原生传参写法 setTimeout(Rotate, 5000, i);
内容的提问来源于stack exchange,提问作者user3098629
相关产品推荐
相关产品推荐

