javascript - 像这种是闭包吗?
巴扎黑
巴扎黑 2017-04-11 11:02:20
[JavaScript讨论组]
component.on('load',function(){
        var s = 0;
        for (var i = 0; i < 100; i++) {
            setTimeout(function(){
                s+=0.01;
                draw(s);
            },i*10);
        }
    });

我理解的闭包是一个函数定义在一个函数中,这个函数内引用有外部函数的变量,然后在外部函数的外面被执行.
但是今天看一个视频说上面setTimeout利用了闭包,我搞不懂哪里用到闭包了,是我对闭包的理解有错误吗?

巴扎黑
巴扎黑

全部回复(2)
PHPz

是闭包。
我再写个更简单版的:

var s = 1;
setTimeout(function() {
    s = s + 1;
}, 1000);

为什么是闭包呢?

从事件循环的角度来看,外部变量s原本在当前这一轮事件循环就会被销毁的。但是现在它被setTimeout的回调函数引用了,而setTimeout的回调函数一定是在下一轮或者更久以后的事件循环中被调用,所以s的生命周期被延长到那个时候。这就是闭包。

你可能会说:这里并没有函数套函数啊?是的,谁说必须要函数套函数才是闭包了?!其实只要是一个函数引用了外部作用域中的变量,使得变量的生命周期得到延长,就是闭包了。虽然上述函数没有套在闭包里,但是它套在了全局作用域中。

巴扎黑

你的示例中,component 的监听函数中,声明了一个匿名函数,并做为参数传入的 setTimeout,不就是在“一个函数定义在一个函数中”。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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