什么是闭包
本文原本上传于本人的博客,现复制过来。
什么叫闭包
对于闭包,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