首页 > 设计 > WEB开发 > 正文

JavaScript 闭包

2019-11-02 18:22:40
字体:
来源:转载
供稿:网友

我们在了解闭包之前首先了解一下以下几点:

变量作用域

变量分为:全局变量局部变量。 首先我们,根据以下几个例子了解一下变量作用域:

这里写图片描述 函数内部可以访问全局变量但是外部无法访问内部变量。 这里写图片描述 函数内部的变量如果不加 var 关键字就会变成全局变量。作用域链:把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止。当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续。如果找到最后也没找到需要的变量,则解释器返回undefined。

javaScript 内存回收机制

Javascript垃圾回收的机制很简单:一个函数在执行开始的时候,会给其中定义的变量划分内存空间保存,以备后面的语句所用。等到函数执行完毕返回了,这些变量就被认为是无用的了,对应的内存空间也就被回收了。下次再执行此函数的时候,所有的变量又回到最初的状态,重新赋值使用。但是这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

闭包

概念:

各种专业文献上的”闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的用途: 1、获取函数内部的变量 这里写图片描述 如图,使用闭包的方式来访问函数内部的变量。 因为,A内部的匿名函数属于A的子类,因此可以访问父类的变量。我们将这个匿名函数作为返回值返回。这样就可以访问A的变量。 2、将变量存储在内存中 这里写图片描述 如图,使用闭包将变量存储在内存当中。 原因:这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到的。并且这个内部函数又使用了外部函数的某些变量的话。这种内存回收机制就会出现问题。如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了。所以js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来。也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包。而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收。

使用时候需要注意

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(PRivate value),这时一定要小心,不要随便改变父函数内部变量的值。

参考:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表