谈谈我对JavaScript闭包的理解

闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。

1.何为闭包

百度百科的理解是 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
通俗的讲就是函数a的内部函数b,被函数a外部的一个变量引用的时候,就创建了一个闭包。

2.那如何理解闭包呢?

首先要理解闭包,就得理解JavaScript的变量作用域

1)变量作用域

在JavaScript中变量的作用域无非两种,一种是全局作用域,一种是局部作用域,我们都知道JavaScript的特点就是函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

2)那如何从外部读取函数内部的局部变量?

在实际情况下使用时,如果要从外部读取到函数内部使用的局部变量呢?在通常的写法中,肯定是没有办法的,这时候只有在函数内部写一个函数,再从这个函数中把变量给返回出来,代码如下

funtion fn1(){
	 var n=999;
    function fn2()
      return n; // 999
    }
}

上述代码中fn2可以访问fn1的变量,而fn1则不能访问fn2中的变量,这就是JavaScript中特有的“链式作用域”
子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

3)闭包的概念

就是函数a的内部函数b,被函数a外部的一个变量引用的时候,就创建了一个闭包。
在上述的代码中就符合了这一点,所以就可以说fn2函数是一条闭包

闭包使用的注意点

(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

你可能感兴趣的:(前端学习)