什么是闭包

2019-11-12  本文已影响0人  moyahuang

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

什么叫闭包

对于闭包,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
上一篇下一篇

猜你喜欢

热点阅读