闭包的两个经典例子

1.    下面这段代码想要循环延时输出结果0 1 2 3 4,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果

for (var i = 0; i < 5; ++i) {

     setTimeout(function () {

             console.log(i + ' ');

        }, 100);

}

不能输出正确结果,因为循环中setTimeout接受的参数函数通过闭包访问变量i。javascript运行环境为单线程,setTimeout注册的函数需要等待线程空闲才能执行,此时for循环已经结束,i值为5.五个定时输出都是5 修改方法:将setTimeout放在函数立即调用表达式中,将i值作为参数传递给包裹函数,创建新闭包

for (var i = 0; i < 5; ++i) {

      (function (i) {

            setTimeout(function () {

                  console.log(i + ' ');

            }, 100);

      }(i));

}

2.    function add(){var x=1; console.log(++x);}

add();//执行输出2,

add();//执行还是输出2,

怎样才能使每次执行有加1效果呢?使用闭包

function add(){var x=1;return function(){console.log(++x);};

var num=add();

num();//输出2,

num();//输出3,

num();//输出4,

.

.

.

依次.....就实现了加1效果.

    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,814评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,092评论 1 10
  • js简介 Js是一种基于事件和对象驱动的解释性、松散性的语言。 一切皆对象 javascript 布兰登艾奇 ...
    塔库纳玛哈哈阅读 1,233评论 0 2
  • 问题 一、什么是闭包? 有什么作用? 闭包闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函...
    婷楼沐熙阅读 596评论 0 0
  • 《奇葩说》 这档综艺也是网红综艺,在今年迎来第四季,节目看起来是对一些社会问题的讨论与思考,但本质上是一个贩卖观点...
    取什么取阅读 253评论 0 0