美文网首页
闭包,闭包,闭包

闭包,闭包,闭包

作者: 白手_ | 来源:发表于2018-04-12 17:38 被阅读0次

    1、这家伙到底是什么?

    网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变量解析,作用域链等相关概念-并不是那么了解,所以看得云里雾里。

    先把结论放出来:就是一种允许函数向关联的父级作用域寻址的访问特权,下面一步步解释

    有人说:闭包不就是函数内部返回一个函数?真的就只是这样?

    下面大家看看这个东西?

    var a = 1
    var b = function(){
      var temp = 2
      return function(){
        console.log(temp)
        console.log(a)
      }
    }
    var c = b()
    c()    // 打印 2 1
    

    我们来看看这个c到底是什么?

    没有对比,我还是看不懂!这里,我删除console.log(temp)试试

    这个时候,你再翻译closure试试,没错!它丫的就叫闭包,通过对比上面两张图,我写了一句console.log(temp)就多出了一个closure,那为什么呢?

    2、闭包的产生

    其实console.log(temp)换句话说,我需要temp这个家伙来用于未来打印,请注意在执行后var c = b(),如果没产生闭包对temp产生引用,temp会被垃圾回收机制clear掉。所以,既然我要用,我就用closure把你存起来,这个时候,闭包也就产生了!
    这里就包含一个开始说到的概念:作用域链scope chain

    3、作用域链

    我们接着上面的例子来看

    var a = 1 
    
    var b = function (){
        var b1 = 2
        return function(){
            var b2 = 3
            console.log(b1)
            return function(){
                            console.log(b2)
            }
        }
    }
    var c = b()
    var d = c() 
    

    我们来看看,这个多层闭包嵌套后,小家伙到底是什么?

    我们可以看到,它是一层一层往上建立closure,最顶层是Global

    特别注意

    如果父函数产生了闭包,那么子函数不管是否产生闭包,都将继承闭包。

    谢谢大家,欢迎指正。

    相关文章

      网友评论

          本文标题:闭包,闭包,闭包

          本文链接:https://www.haomeiwen.com/subject/nnsxcftx.html