变量提升以及块级作用域问题

170 阅读1分钟

改造 以下代码,并依次输出0-9

for(var i=0;i<10;i++){
   setTimeout( 
      ()=>{console.log(i)},1000)
}

方案一:解决用let代替var 解决变量提升带来的问题
for(let i=0;i<10;i++){
  setTimeout(()=>{
    console.log(i)
  },1000)
}

//方案二:立即执行函数解决块级作用域的问题
for(var i=0;i<10;i++){
    (function(i){
      setTimeout(()=>{
        console.log(i)
      },1000)
  })(i)
}
//方案三:定时器内不执行函数,让其浏览器自身给其包装好成方案二类似的函数
for(var i=0;i<10;i++){ 
      setTimeout(
        console.log(i)
      ,1000)
}

//方案四和三实现原理差不多
for(var i=0;i<10;i++){ 
      setTimeout(
        eval('console.log(i)')
      ,1000)
}

//方案五:彻底改变其执行过程,而是采用闭包解法
setTimeout(()=>{
  for(var i=0;i<10;i++){     
       console.log(i)
   }
},1000)

//方案六:利用try/catch的块级作用域实现
for(var i=0;i<10;i++){
  try{
     throw i
   }catch(i){
     setTimeout(()=>{
          console.log(i)},
     1000)
   }
}