JS - 闭包学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS - 闭包学习相关的知识,希望对你有一定的参考价值。

       刚学习了闭包,主要是从廖雪峰的官方网站和阮一峰的网络日志中学的。总结如下:

   JS的闭包,就是一个函数A里面有一个内嵌的函数B,A 返回的是B 。B可以访问A的参数和局部变量,当A返回B时,A的参数和局部变量就保存在B中,这就是闭包。B在返回时并没有立刻执行,z直到调用时候B()才执行。

  在A里定义局部变量,一定要用到var 来定义,否则该变量就默认为全局变量了。

闭包的用途

      闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

     (摘自阮一峰的网络日志)

      在面向对象的程序设计语言里,比如Java和C++,要在对象内部封装一个私有变量,可以用private修饰一个成员变量。

      在没有class机制,只有函数的语言里,借助闭包,同样可以封装一个私有变量,从外部读取局部变量

    (摘自廖雪峰的官方网站)

使用闭包的注意点

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

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

  (摘自阮一峰的网络日志)

  3)返回闭包B时牢记的一点就是:闭包B不要引用任何循环变量,或者后续会发生变化的变量。如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。(摘自廖雪峰的官方网站)

 

以上是关于JS - 闭包学习的主要内容,如果未能解决你的问题,请参考以下文章

《JS权威指南学习总结--8.6 函数闭包》

关于闭包的理解(JS学习小结)

从node.js模块化开发来了解javascript闭包

Spark闭包与序列化

JS - 闭包学习

[学习笔记]JS中闭包的理解