2013年5月31日星期五

晚上就当一场梦见了一个不该见的人,继续回到我现实真实交往世界中吧,最后摘录一些自己今天看到有意义的一些话:

闭包就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的。

  在理解闭包前最好能先理解一下作用域链的含义,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而内部的规则是把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续如果找到最后也没找到需要的变量,则解释器返回undefined

了解了作用域链,再来看看js的内存回收机制一般来说,一个函数在执行开始的时候,会给其中定义的变量划分内存空间保存,以备后面的语句所用,等到函数执行完毕返回了,这些变量就被认为是无用的了对应的内存空间也就被回收了下次再执行此函数的时候,所有的变量又回到最初的状态,重新赋值使用但是如果这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到,并且这个内部函数又使用了外部函数的某些变量的话这种内存回收机制就会出现问题如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了所以js解释器在遇到函数定义时,会自动把函数和可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收

posted on 2013-05-31 22:50  时间朋友  阅读(166)  评论(0编辑  收藏  举报

导航