闭包的两个经典例子

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效果.

    

猜你喜欢

转载自blog.csdn.net/linyeban/article/details/55105201