读懂闭包

闭包

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

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

  • 闭包与变量

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

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和arguments时,只会搜索到活动对象为止,因此这里永远不能打印出hello,可以把代码做这样的修改

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

这样就能当问到hello,_this是我们在包含函数中特意声明的一个变量,所以闭包也可以访问
注:用es6的箭头函数也可以解决这个问题

  • 是否会造成内存泄漏?

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值