javascript常见运行题总结

102 阅读1分钟

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