* 定义:一个函数可以访问另一个函数内部的变量
* 形成条件
1. 一个函数(fn1)的返回值是另一个函数(fn2)
2. fn2中调用了fn1内部的变量
3. fn2在外部执行了
*
* 作用
1. 实现封装过程。封装对象中的变量不能直接访问,提过返回的getter/setter方法来访问。
```
function Person() {
var name = '张三';
return {
getName() {
return this.name;
},
setName(value) {
this.name = value;
}
}
}
```
2. 模拟块级作用域
```
function fn(num){
for(var i=0; i<num; i++){}
console.log(i);
}
fn(2); //2
// 通过闭包模拟实现
function fn(num){
(function(){
for(var i=0; i<num; i++){}
})();
console.log(i);
}
fn(2); //error "i is not defined"
```
3. 解决for循环的问题
```
function fn(){
for(var i=0; i<5; i++){
setTimeout(function(){
console.log(i);
},i*1000);
}
}
fn(); //每隔1s输出一次"5",共输出4次
//原因:i是var声明的变量,在函数范围内有效,每次for循环全局变量的i都会改变,所有每次输出的都是同一个i
// 通过闭包解决
function fn(){
for(var i=0; i<5; i++){
(function(j){
setTimeout(function(){
console.log(j);
},i*1000);
})(i);
}
}
fn(); //每隔1秒分别输出0 1 2 3 4
```