JS-闭包理解

什么叫做闭包?

闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
JS中的闭包总让人感觉是一个相对模糊的概念,其实在我们在平时写代码的时候已经不知不觉用到了很多闭包,我个人对闭包的理解总的来说就是,外部函数嵌套内部函数,内部函数引用了外部函数的变量(函数)时,就产生了闭包。总结来说产生闭包的条件包含以下几点:1、函数嵌套,2、内部函数引用了外部函数的数据(变量或者函数),3、外部函数被调用。同时满足以上三个条件才能产生闭包。
比如以下语句:

function f1(){
    var n="Joey_Tribiani";
    function f2(){
      console.log(n); //Joey_Tribiani
    }
    f2();
  }

这段代码其实就已经实现了函数闭包,变量n定义在f1函数内部f2函数外部,当它们被调用时f2函数是可以用到这个变量的,因此符合我们讲的闭包的产生条件,这就是一个简单的闭包。

闭包的作用

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。同时由于变量定义在函数内部,这样子也不会造成对全局命名空间的污染。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。(这个需要重点理解)

使用闭包的注意点

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

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

发布了19 篇原创文章 · 获赞 0 · 访问量 296

猜你喜欢

转载自blog.csdn.net/Joey_Tribiani/article/details/103543103