关于js闭包我的理解 a函数的作用域被此对象保存到了外部,此对象内的函数将一直保存函数a的执行期上下文
Object add: ? (...args) arguments: null caller: null length: 0 name: "add" prototype: {constructor: ?} [[FunctionLocation]]: index.html:22 [[Prototype]]: ? () [[Scopes]]: Scopes[2] 0: Closure (a) b: 0 [[Prototype]]: Object 1: Global {window: Window, self: Window, document: document, name: '', location: Location, …} reset: ? () [[Prototype]]: Object
上图是JS执行后控制台输出内容
其中scopes 对象就是执行期上下文 (active object)又叫作用域,内部函数存有外部函数的作用域,一环扣一环就成了作用域链,只有浏览器能访问到的对象
示例中函数里的scopes里的 Closure(域的代数闭包)中 存放着本来在它外部的执行期上下文,这也就解释了闭包可以持续访问函数外部的变量
其本质是因为外部函数执行完毕虽应当销毁,但返回内容中预编译时已经使用了外部函数的变量,导致内存无法被销毁且被返回对象持有,而是只清除了关于函数a对它自己的栈内存(记录函数内存地址的东西)
闭包的好处:
使变量私有化,不会产生重复命名的变量导致程序错误;
闭包的坏处:
内存不能释放就会越来越多,导致程序变慢;
总结:
// 观察闭包不必拘泥于是否有返回值,要看是否有内部的可执行内容被保存到了外部