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