1.什么是闭包?
- MDN:闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。
- 我的理解就是:当嵌套函数访问外部函数中的局部变量时,就产生了闭包。
MDN中的例子:
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
2.什么时候产生闭包?
- 当在一个函数中创建另一个函数时就会产生闭包。
3.闭包的应用场景
- 私有化变量
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
return displayName;
}
var reFunc = init();
init函数中的name变量成了只有displayName函数(闭包)可以访问的私有变量,其他函数无法访问。
因为displayName函数的作用域链中有对init()函数活动对象的引用,能访问其作用域中的变量。
-
缓存变量
-
防止全局作用域中变量污染