(1)循环setTimeout
for(var i=0;i<6;i++){
setTimeout(function(){
console.log(i)
},i*1000)
}
执行结果
总结:settimeout的i值,是一个全局变量i(可以跨块级作用域,for是块级作用域),每次循环这个值都会改变,指向的是最外层也就是全局的i值,当1秒后打印的时候,i的值已经变成了9,所以打印出来的是九个9
(2)把var改成let
for(let i=0;i<6;i++){
setTimeout(function(){
console.log(i)
},i*1000)
}
执行结果,因为let是块级作用域内有效,settimeout的i值指向的是每个循环体中的i值
(3)要想立即执行,改成立即执行函数
for(var i=0;i<6;i++){
setTimeout((function(){
console.log(i)
})(),i*1000)
}
执行结果同上;
从字面意思理解:立即函数就是立即执行无需等待回调,代码加载就立即执行
(4)立即执行函数再外层,需要传参数i
for(var i=0;i<6;i++){
(function(i){
setTimeout(function(){
console.log(i)
},i*1000)
})(i)
}
因为每个i的值都会传入function中,settimeout中的i作用域在这个闭包中
(5)试着给立即执行函数return一个function,setTimeout函数执行的就是这个function
for (var i = 0; i < 5; i++) {
setTimeout((function(i) {
console.log(i);
return function() {
console.log('回调')
console.log(i)
}
})(i), i * 1000);
}
执行结果
先执行立即函数,再进行回调