闭包原理解析及其应用场景

闭包是一个词法作用域和函数特性组合在一起形成的一个新特性。闭包是被创造出来,用来描述这个新特性的。所以要理解闭包,必须先理解作用域和函数的概念。

函数概念无需赘述

作用域的外表是一对大括号,其本质是一个按照一组规则对内存中的变量进行查找的工具,也有人把它直接理解为一套规则。规则大致是,当程序需要某个变量时,会先在当前作用域查找,如果找不到会继续在外层作用域查找,逐级往上,直到找到该变量,或者查找完全局作用域。

下面的代码清晰地展示了闭包:

function foo() {
          var a = 2;
          function bar() {
            console.log( a );
          }
          return bar;
        }
var baz = foo();
baz(); // 2

一般情况下,foo()执行后,其所在的整个作用域会被垃圾回收器释放。但是,由于bar() 依然持有对该作用域的引用,这个作用域包括其附属的变量都不会被回收,这个引用就叫作闭包。

当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

 

posted @ 2018-12-13 18:00  土拉发子  Views(1588)  Comments(0Edit  收藏  举报