function f1(){
var result=[];
for(var i=0;i<10;i++){
result[i]=function(){
return i
}
}
return result
}
console.log(  f1()[0]()  )
console.log(  f1()[1]()  )

结果都是10,我的理解是这样的:
调用f1()[0]()是先执行第一个小括号f1(),此时result[0],result[1]..的值都是一个函数而未赋具体的值,也就是下边这代码并未执行

      return i

,尽管此时的i是0,1,2,3…;f1()执行完后i的值变成了10;而执行到第二个小括号f1()[0]()时,

      return i

这段代码才真正的起作用,但此时i变成了10

问一下我的理解对吗

回答

闭包是一个绑定执行环境的函数,执行环境中i经过for循环变成10了,后面执行函数的时候,读到的值就是10

这其实是个变量作用域的问题。i在f1的最终值是10。var的作用域有两个,一个是全局一个是函数内,而缺少块级作用域,实际代码等同于下面。如果你把var 换成 let那就不一样了。let是有块级作用域的。
`

  function f1(){
      var result=[];
      var i =0;
      for(;i<10;i++){
          result[i]=function(){
              return i
          }
      }
      return result
  }
  console.log(  f1()[0]()  )  
  console.log(  f1()[1]()  )

`

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up