资讯专栏INFORMATION COLUMN

读懂闭包

Scliang / 835人阅读

摘要:闭包个人理解就是把内部函数变量什么的暴露出去,使在外部可访问。比如闭包的作用域中保存元素时,以为这钙元素将无法被销毁,这时,可以把该对象的副本,加入是保存在变量中,然后闭包结束时,把置为空谨记闭包会应用包含函数的整个活动对象

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

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

闭包与变量

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

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置为空

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93572.html

相关文章

  • JavaScript闭包,只学这篇就够了

    摘要:当在中调用匿名函数时,它们用的都是同一个闭包,而且在这个闭包中使用了和的当前值的值为因为循环已经结束,的值为。最好将闭包当作是一个函数的入口创建的,而局部变量是被添加进这个闭包的。 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义。 其实只要理解了核心概念,闭包并不是那么的难于理解。但是,网上充斥了太多学术性的文章,对于...

    CoderBear 评论0 收藏0
  • 你不知道的JavaScript:闭包

    摘要:回忆我一年前,虽然使用过很多,但却完全不理解闭包是什么。就算你,也会在循环完成时,输出次当然,不要以为主要的原因是延迟函数会在循环结束时才执行,不然我为什么会在闭包这一节用使用这个例子,哈哈。 前言 在了解闭包的概念时,我希望你能够有JavaScript词法作用域的知识,因为它会让你更容易读懂这篇文章。 感触 对于那些使用过JavaScript但却完全不理解闭包概念的人来说,理解闭包可...

    weknow619 评论0 收藏0
  • 详解js中的闭包

    摘要:定义函数的时候,为什么的值重新从开始了因为又一次运行了函数,生成一个新的的活动对象,所以的作用域链引用的是一个新的值。 前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以《javascript高级程序设计》里面的理论为基础。用拆分的方式,深入讲解一下对于闭包的理解,如果有不对请指正。 写在闭包之前 闭包的内部细节,...

    chaosx110 评论0 收藏0
  • JavaScript系列——JavaScript同步、异步、回调执行顺序之经典闭包setTimeou

    摘要:同步异步回调傻傻分不清楚。分割线上面主要讲了同步和回调执行顺序的问题,接着我就举一个包含同步异步回调的例子。同步优先回调内部有个,第二个是一个回调回调垫底。异步也,轮到回调的孩子们回调,出来执行了。 同步、异步、回调?傻傻分不清楚。 大家注意了,教大家一道口诀: 同步优先、异步靠边、回调垫底(读起来不顺) 用公式表达就是: 同步 => 异步 => 回调 这口诀有什么用呢?用来对付面试的...

    lewif 评论0 收藏0

发表评论

0条评论

Scliang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<