关于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对它自己的栈内存(记录函数内存地址的东西)

  闭包的好处:

    使变量私有化,不会产生重复命名的变量导致程序错误;

  闭包的坏处:

    内存不能释放就会越来越多,导致程序变慢;

总结:

// 观察闭包不必拘泥于是否有返回值,要看是否有内部的可执行内容被保存到了外部