读懂闭包

发布时间:2019-08-10 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了读懂闭包脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

闭包

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

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

  • 闭包与变量

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

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等于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())此时弹出的是

读懂闭包

对,就是把里面的内容打印出来了,并没有调用。内部函数在搜索thisarguments时,只会搜索到活动对象为止,因此这里永远不能打印出hello,可以把代码做这样的修改

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

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

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

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

脚本宝典总结

以上是脚本宝典为你收集整理的读懂闭包全部内容,希望文章能够帮你解决读懂闭包所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。