首页 > 代码库 > 对于闭包的一些理解
对于闭包的一些理解
一、闭包的定义
关于闭包的定义众说纷纭,下面是一些权威给出的说法:
高程3:“闭包是指有权访问另一个函数作用域中的变量的函数”;
犀牛书:“函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为‘闭包’”;
你不知道的JavaScript(上卷):“当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行”。
而我对于闭包通俗直白的个人理解是:函数定义的作用域链在函数执行后不会消失,而是由内部函数持有对这个函数的作用域的引用,这个引用就叫作闭包。
可以看出,闭包完全是跟“(词法)作用域”想关联,作用域之前已做过大致介绍,之后将会再次深入讨论(词法)作用域。
二、实例
var variable = "window say hello";function localFun(){ var variable = "localFun say hello"; function f(){ return variable ; } return f;}localFun()();
这里调用 localFun() 会返回 "localFun say hello",相信大家都已经猜到了,但是为什么会返回这个结果呢?我是这样理解的:这里f()是localFun()的嵌套函数,它持有对localFun()内部作用域的引用(而这个引用就叫做闭包),这个引用捕捉到了局部变量,并一直保存了下来,所以返回的是"localFun say hello"。
但是可能有人会觉得外部函数中定义的局部变量在函数返回后就不存在了,所以localFun()的返回值应该是"window say hello"。但现实并非如此,在js中,每次调用函数的时候,都会为之创建一个对象保存局部变量,把这个对象添加到作用域链中。当函数返回的时候,如果没有嵌套的函数,也没有其他引用指向这个绑定对象的时候,它才会被当作垃圾回收掉;而如果函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数,他就不会被当做垃圾回收。
总结:无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。
对于闭包的一些理解