闭包学习

311 阅读2分钟

什么是闭包

我遇到的两个解释:

  • 我们举个例子,有一个函数A。函数A里还定义了一个函数B,当我们不管把函数B放在哪个地方去调用,我们都可以让B能够在A函数的词法作用域中生效,意思就是B函数不管咋样都能访问到A函数,这样的一个现象我们称之为闭包。
  • 闭包是函数的特性,即便只有一个函数,也可以说他行成了闭包,内部的变量外部不可读,因为外部还有个全局的作用域包裹着它。

闭包有什么作用?

  1. 在我们团队开发时,每个开发者把自己写的代码都放在一个私有的作用域中,只用return和window.xxx的方法让私有作用域里的东西传在全局下去(保护作用)。
  2. 我们可以通过闭包使遍历时,每次创造出来的私有的作用域保存下来(保存作用)。

闭包的实际应用

现在我们要把十个函数放入一个数组arr中,需要这么做?按照常规操作我们会这样写,如下:

      function test() {
          var arr = []
  		for (var i = 0; i < 10; i++) {
    		arr[i] = function () {
      			console.log(i);
            }
          }
          return arr
        }
        var myArr = test()

        for (var i = 0; i < 10; i++) {
          myArr[i]()
        }

但是这样写输出的结果是什么呢?答案:输出了10个10。

提问:为什么答案是这样的呢?

说通俗点就是:嗐!就是函数里的for循环遍历完十次之后,第一个i = 0都还没有存入到函数体里去,而遍历的操作已经做完了,导致i已经等于10时,第一次存值的操作才进行完。所以十次存值的操作,存进去的结果都是10。

提问:那怎么样解决这个问题呢?

我们可以写一个闭包,把每一次的i都储存下来。

   function test() {
      var arr = []
      for(var i = 0; i < 10; i++){
        (function(j){
          arr[j] = function() {
            console.log(j)
          }
        })(i)
      }
      return arr
    }

    var myArr = test()

    for(var i = 0; i < 10; i++){
      myArr[i]()
  }

闭包的缺陷

闭包会造成内存的持续累加,导致到最后由于内存过大而无法运行代码。