美文网首页
什么是闭包

什么是闭包

作者: moyahuang | 来源:发表于2019-11-12 14:05 被阅读0次

    本文原本上传于本人的博客,现复制过来。

    什么叫闭包

    对于闭包,MDN上的解释是这样的

    A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function’s scope from an inner function. In JavaScript, closures are created every time a function is created, at function creation time.

    也就是说,任何一个方法创建后,闭包就会被创建。一个闭包是一个函数和它的词法环境(即该方法创建时所处的作用域的所有资源)

    要理解什么是闭包,先看下面两个例子:

    例一:

    function init() {
        var name = "Mozilla"; // name is a local variable created by init
        function displayName() { // displayName() is the inner function, a closure
            alert (name); // displayName() uses variable declared in the parent function    
        }
        displayName();    
    }
    init();
    

    上述代码的效果不须我在这里赘言。函数displayName可以访问其外部函数的变量name,因此其弹出的警示框内容为name的值”mozilla"。

    例二:

    function makeFunc() {
      var name = 'Mozilla';
      function displayName() {
        alert(name);
      }
      return displayName;
    }
    
    var myFunc = makeFunc();
    myFunc();
    

    JS的闭包特性可以从上面这个栗子中得到体现。因为通常来说,方法调用后(makeFunc()),方法内创建的所有资源也会随之销毁。但是当方法displayName作为makeFunc的返回值被传递给myFunc后,我们发现调用myFunc的效果与例1相同。这里就足以说明在JS中,不仅是displayName方法本身被返回,其所在词法环境(我想说人话,但还是术语比较高效)也被返回,因此警示框仍正常提示“Mozilla”。

    闭包的一些具体用例

    【用例一】 调整网页字体大小
    简书好像不能嵌入codepen代码,这里给一个链接https://codepen.io/moyahuang/pen/pooZXbw

    参考资料
    1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

    相关文章

      网友评论

          本文标题:什么是闭包

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