## for循环 js定时器 闭包 自执行函数##
前言
面试题目经常会出现这么一道题目,请将1-10有序每隔一秒输出。看似这个题目很简单,但是确难倒了很多js初学者。还有跟这个类似情况,比如给五个dom添加hover事件,理想效果是打印出当前索引,知识都是打印出最后一个值。
错误代码:
var len =10
for(i = 0; i < len; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
解决方案:(要引入闭包来保存变量i不被销毁)
for (var i = 1; i < 4; i++) {
(function(a) {
setTimeout(function() {
console.log(a);//操纵变量a,和i无关
}, 3000);
})(i)// i是参数 对应着a
}
结果:(3s后输出123)
1
2
3
也可以这样写:
for (var i = 1; i < 4; i++) {
setTimeout(fn(i), 3000);
}
function fn(a){
return function(){
console.log(a);
}
}
如果要实现,没隔3s输出一个数字,即,3s输出1,3s后再输出2…,就要对定时器时间设置
for (var i = 1; i < 4; i++) {
(function(a) {
setTimeout(function() {
console.log(a);
}, a*3000); //3000代表间隔
})(i)
}
后续如果有补充,会继续添加…