• 4
  • 新人请关照

关于JS的 闭包,想问个问题

  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

问一下我的理解对吗

阅读 200
评论
    3 个回答
    • 174

    闭包是一个绑定执行环境的函数,执行环境中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]()  )

      `

        • 795

        楼上正解,i 是在函数作用域内的一个唯一变量,数组中存入的都是这个 i,所以执行的时候也是最终的 i 值

          撰写回答

          登录后参与交流、获取后续更新提醒