一. 什么是闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
<script>
function f1(){ // fn1 就是闭包函数
var num = 5;
function f2(){
console.log(num); // 10
}
f2()
}
fn1();
</script>
1.1 在 chrome 中调试闭包
- 打开浏览器,按 F12 键启动 chrome 调试工具。
- 设置断点。
- 找到 Scope 选项(Scope 作用域的意思)。
- 当我们重新刷新页面,会进入断点调试,Scope 里面会有两个参数(global 全局作用域、local 局部作用域)。
- 当执行到 f2() 时,Scope 里面会多一个 Closure 参数 ,这就表明产生了闭包。
二. 闭包是如何产生的
当一个嵌套内部的子函数访问嵌套外部的父函数的变量(函数)时,就产生了闭包。
三. 闭包的作用
- 使用用函数内部的变量(局部变量)在执行完后,仍然存活在内存中,
延长了局部变量的声明周期。 - 然函数外部可以操作函数内部的变量(函数)。
四. 闭包的应用
// 闭包应用-计算打车价格
// 打车起步价13(3公里内), 之后每多一公里增加 5块钱. 用户输入公里数就可以计算打车价格
// 如果有拥堵情况,总价格多收取10块钱拥堵费
// function fn() {};
// fn();
var car = (function() {
var start = 13; // 起步价 局部变量
var total = 0; // 总价 局部变量
return {
// 正常的总价
price: function(n) {
if (n <= 3) {
total = start;
} else {
total = start + (n - 3) * 5
}
return total;
},
// 拥堵之后的费用
yd: function(flag) {
return flag ? total + 10 : total;
}
}
})();
console.log(car.price(5)); // 23
console.log(car.yd(true)); // 33
console.log(car.price(1)); // 13
console.log(car.yd(false)); // 13
总结:
闭包在嵌套函数内部执行完时就产生了,闭包在嵌套的内部函数成为垃圾对象时就销毁。
它的缺点是函数执行完后,函数内部的局部变量没有释放,因此,闭包能不用就不用,如果使用到了闭包需及时释放,否则会导致内存泄漏。