最新消息:文章中包含代码时,请遵守代码高亮规范!

关于闭包的两个经典问题 【转载】

JavaScript harbour 246浏览 0评论

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

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/23482.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者harbour的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!