闭包:
1. 问题: 全局变量和局部变量都有不可兼得的优缺点:
(1). 全局变量:
a. 优: 可重用
b. 缺: 极易被污染——将来在公司中禁止使用一切形式的全局变量。
(2). 局部变量:
a. 优: 不会被污染
b. 缺: 不可重用
2. 解决: 今后,只要希望给一个函数定义一个专属的且可重用的变量,只有函数自己可用,别人不可用时,就用闭包!
3. 什么是闭包:
(1). 用法: 既重用变量,又保护变量不被污染的一种编程方法。
(2). 本质: 外层函数调用后,外层函数的作用域对象,被内层函数引用着,无法释放,就形成了闭包对象——一句话概括闭包如何形成的!
4. 如何: 3步
(1). 用外层函数包裹要保护的变量和使用变量的内层函数
(2). 在外层函数内部,返回内层函数对象。
(3). 调用外层函数,用变量接住返回的内层函数对象。
6. 缺点: 闭包返回的内存函数,比普通函数多占用一块内存空间。
7. 解决: 如果一个闭包不打算使用了,应该及时释放!
保存内层函数的外部变量=null
释放了内层函数对象
同时也释放了外层函数的作用域对象。
8. 示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//定义一个函数,帮小孩儿管理零花钱
//1. 用外层函数包裹要保护的变量和使用变量的内层函数
function mother(){
var total=1000;
//2. 在外层函数内部,返回内层函数对象。
return function(money){
//从总价中减去本次花的前
total-=money;
console.log(`花了${money},还剩${total}`);
}
}
//3. 调用外层函数,用变量接住返回的内层函数对象。
var pay=mother();
//pay:function(money){
//total-=money;
//console.log(`花了${money},还剩${total}`);
//}
pay(100);//剩900
//别人代码中:
total=0;
pay(100);//剩800
</script>
</body>
</html>
运行结果:
花了100,还剩900
花了100,还剩800