17、闭包

for(var i = 0;i<10;i++){
  setTimeut(()=>{
    console.log(i)
  },10000)
}
//输出10次10,因为不是私有变量。setTimeout是异步的
//将var改成let,let定义的局部块的变量,每次循环都会在当前块作用域中形成私有变量i,定时器执行的时候所使用的i是所属作用域的i
for(let i = 0;i<10;i++){
  setTimeut(()=>{
    console.log(i)
  },10000)
}
//输出0,1,2,3,...,因为不是私有变量。setTimeout是异步的
//使用闭包保存i 
for(var i = 0;i<10;i++){
  (function(i){
    setTimeut(()=>{
        console.log(i)
      },10000)
  })(i)
}
//使用闭包也可以这样写
for(var i = 0;i<10;i++){
  setTimeut(((i)=>{
   return ()=>{
      console.log(i)
   }
  })(i),10000)
}
//也可以使用bind保存i的值,基于bind预先处理机制。循环的时候就将bind要预先处理的函数传过去
var fn = function(i){
    console.log(i)
}
for(var i = 0;i<10;i++){
  setTimeut(fn.bind(null,i),10000)
}

results matching ""

    No results matching ""