读懂闭包

闭包

我的理解就是把内部函数、变量什么的暴露出去,使在外部可访问。闭包至少有两个函数,一个外部函数,一个内部函数

红皮书中关于闭包讲的很详细,看过了在这里作个记录:html

  • 闭包与变量

闭包只能取得包含函数中任何变量的最后一个值,由于闭包所保存的是整个变量,而不是某个特殊变量es6

function creatFunctions(){
    var result=new Array()
    for(var i=0;i<10;i++){
      result[i]=function(){
        return i
      }
    }
    return result;
  }

这段代码返回的每一个值是10,而不是看起来的1,2,3........,再看下面的代码:数组

function creatFunctions(){
    var result=new Array()
    for(var i=0;i<10;i++){
      result[i]=function(num){
        return function(){
          return num
        }
      }(i)
    }
    return result;
  }

发现不一样了么,第二段代码中不是把闭包赋值给数组,而是定义一个匿名函数,传入参数,并当即执行。由于函数参数是按值传递,这样就能够遍历出1,2,3........闭包

  • this

this的问题看了好久,也看了不少次,这里结合闭包说一下
注意:在全局函数中,this等于window,当函数被当作某个对象的方法调用时,this等于那个对象函数

var name="The Window"
  var object={
    name:"hello",
    getNameFunc:function(){
      return function(){
        return this.name
      }
    }
  }
  alert(object.getNameFunc()())

在调用object.getNameFunc()()时,是两个括号,此时弹出的是The Window,猜猜为何?
若是去掉括号,变成alert(object.getNameFunc())此时弹出的是
图片描述this

对,就是把里面的内容打印出来了,并无调用。内部函数在搜索this和arguments时,只会搜索到活动对象为止,所以这里永远不能打印出hello,能够把代码作这样的修改spa

getNameFunc:function(){
      var _this=this
      return function(){
        return _this.name
      }
    }

这样就能当问到hello,_this是咱们在包含函数中特地声明的一个变量,因此闭包也能够访问
注:用es6的箭头函数也能够解决这个问题code

  • 是否会形成内存泄漏?

所谓的内存泄漏,是指IE9以前的版本对JScript对象和COM对象使用不一样的垃圾收集历程,因此闭包在IE的这些版本中可能致使一些特殊的问题,这是能够解决的。
好比闭包的做用域中保存html元素时,觉得这钙元素将没法被销毁,这时,能够把该对象的副本,加入是element.id保存在变量中,而后闭包结束时,把element=null置为空htm

谨记:闭包会应用包含函数的整个活动对象对象

相关文章
相关标签/搜索