关于js中函数的闭包 深入了解

时间:2021-12-10 17:34:25

闭包就是能够读取其他函数内部变量的函数。

即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。-----个人理解就是:闭包是能够读取其他函数内部变量的函数,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁

如下面例子4

这段代码有以下两个特点:

     1函数b嵌套在函数a内部;2、函数a返回函数b;

引用关系如下图:

         关于js中函数的闭包 深入了解关于js中函数的闭包 深入了解

     这样在执行完var c = a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:

  当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。

     当函数b执行的时候亦会像以上步骤一样。因此,执行时b的作用域链包含了3个对象:b的活动对象、a的活动对象和window对象,如下图所示:

         关于js中函数的闭包 深入了解关于js中函数的闭包 深入了解

如图所示,当在函数b中访问一个变量的时候,搜索顺序是:

1.    先搜索自身的活动对象,如果存在则返回,如果不存在将继续搜索函数a的活动对象,依次查找,直到找到为止。

2.    如果函数b存在prototype原型对象,则在查找完自身的活动对象后先查找自身的原型对象,再继续查找。这就是Javascript中的变量查找机制。

3.    如果整个作用域链上都无法找到,则返回undefined

三、闭包的用途及优势

(一)、用途

    1、闭包可以读取函数内部变量    2、将函数内部变量的值始终保存在内存中

例子

关于js中函数的闭包 深入了解关于js中函数的闭包 深入了解

     这个例子中的result实际上就是闭包函数b,他一共运行两次,第一次值99,第二次值为100,这就说明i一直在内存中,而不是在第一次a函数调用之后就自动清除。另外还需注意iAdd=function(){i++;},这里iAdd是全局变量,且它的值为匿名函数,其实也是一个闭包。

(二)、优势

 1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

 2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。

 3、通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)。

函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。