闭包原理解析及其应用场景
闭包是一个词法作用域和函数特性组合在一起形成的一个新特性。闭包是被创造出来,用来描述这个新特性的。所以要理解闭包,必须先理解作用域和函数的概念。
函数概念无需赘述
作用域的外表是一对大括号,其本质是一个按照一组规则对内存中的变量进行查找的工具,也有人把它直接理解为一套规则。规则大致是,当程序需要某个变量时,会先在当前作用域查找,如果找不到会继续在外层作用域查找,逐级往上,直到找到该变量,或者查找完全局作用域。
下面的代码清晰地展示了闭包:
function foo() { var a = 2; function bar() { console.log( a ); } return bar; } var baz = foo(); baz(); // 2
一般情况下,foo()执行后,其所在的整个作用域会被垃圾回收器释放。但是,由于bar() 依然持有对该作用域的引用,这个作用域包括其附属的变量都不会被回收,这个引用就叫作闭包。
当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。
查资料不过是偏门,撸源码才是脱离苦海的正道。