闭包

作者: 马建阳 | 来源:发表于2018-02-18 20:53 被阅读16次

    函数连同它作用域链上的要找的这个变量,共同构成闭包

    一般情况下使用闭包主要是为了

    1.封装数据
    2.暂存数据
    一个典型的案例

    function bindName(name){
      return function(action){
        console.log(`${name} is ${action}ing`)
      }
    }
    
    var doing = bindName('xiaocheng')
    doing('work')
    doing('play')
    
    var doing2 = bindName('xiaoma')
    doing2('work')
    doing2('play')
    
    

    解析

    MDN 上关于闭包的定义

    A closure is the combination of a function and the lexical environment within which that function was declared.

    以上代码相当于

    function bindName(){
      var name = arguments[0]
      function fn(action){
        console.log(`${name} is ${action}ing`)
      }
      return fn
    }
    var doing = bindName('xiaocheng')
    
    

    因为 doing 在全局作用域永远无法被释放,导致 bindName 里声明的fn 和 name 一直存在, 执行 doing 时会从创建 fn 所在的作用域获取 name
    简单说:doing引用fn,fn无法释放,fn里有name,name也无法释放,可用被引用
    注意:每次执行bindName()都会产生一个闭包。

    相关文章

      网友评论

          本文标题:闭包

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