1. setTimeout 题:
for (var i = 1; i <= 5; i++) {
setTimeout( function timer() {
console.log(i);
}, i * 1000 );
}
/// 6,6,6,6,6
解释:定时器外的先执行,i已经变成了6
for (var i = 1; i <= 5; i++) {
console.lgo('定时器外:'+i);
setTimeout( function timer() {
console.log(i);
}, i * 1000 );
}
/// 定时器外:1
定时器外:2
定时器外:3
定时器外:4
定时器外:5
6,6,6,6,6
用闭包完成测试题:
for (var i = 1; i <= 5; i++) {
(function(i){
setTimeout( function timer() {
console.log(i);
}, i * 1000 );
})(i);
}
//上面的代码是标准答案,将变量i作为参数传到闭包中
//我们也可以通过作用域在函数内部把变量隔离起来
//其实,在闭包内部访问i的时候,i就是一个常量
for (var i = 1; i <= 5; i++) {
(function(){
var s = i;//把i赋值给另外一个变量
setTimeout( function timer() {
console.log(s);
}, s * 1000 );
})();
}
//当然,也可以把setTimeout的回调函数做成一个闭包,同样能得到正确的结果。
let关键字形成闭包:
for(let i =1;i<=5,i++){
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
/// 1,2,3,4,5