javascript setTimeout倒计数的问题
阿神
阿神 2017-04-10 16:01:41
[JavaScript讨论组]
$('#test').on('click',function()
{
    
    var $self=$(this);
    var secs=60;
    for(var i=secs;i>=0;i--)
    {
        window.setTimeout(function()
        {
            var text=i+'秒后再次发送';
            console.log(i);
            $self.val(text);
            if(i==0)
            {
                
                
                $self.val('发送验证码');
            }
        }, (secs-i) * 1000);
    }
});

就是发送验证码,然后60秒之后可以再次发送,想做一个倒计数的显示,但是console.log(i)的输出全是-1不知道是怎么回事?

阿神
阿神

闭关修行中......

全部回复(2)
黄舟
$('#test').on('click',function()
{
    
    var $self=$(this);
    var secs=60;
    var func = function() {
        var text=secs+'秒后再次发送';
        $self.val(text);
        if(secs==0)
        {
            $self.val('发送验证码');
        } else {
            secs--;
            window.setTimeout(func, 1000);
        }
    };
    window.setTimeout(func, 1000);
});
PHP中文网

setTimeout是异步执行的,会在空闲的时候执行setTimeout中的函数,而这里的“空闲”大致指的是当前栈中代码执行完毕,也就是这里的for语句执行结束,才会执行timeout中的函数。

所以这里的执行过程是:for语句注册了60个timeout函数,for语句结束后,开始一个一个执行timeout函数。但是这里timeout中的i已经是for执行后的值,也就是-1。(具体请了解什么是闭包)

var secs=60;
for(var i=secs;i>=0;i--) {
    window.setTimeout((function(t) {
        return function() {
            var text=t+'秒后再次发送';
            console.log(text);
        };
     })(i), (secs-i) * 1000);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号