1.问题:全局变量和局部变量都有不可兼得的优缺点:
(1)全局变量:
a.优点:可重用
b.缺点:极易被污染一一将来在公司中禁止使用一切形式的全局变量.
(2)局部变量
a.优点:不会被污染
b.缺点:不可重用
2.解决:今后,只要希望给一个函数定义一个专属的且可重用的变量,只有函数自己可以用,别人不可用时,就用闭包
3.什么是闭包:
(1).用法:既能重用变量,又可以变量不被污染的一种编程方法
(2)本质:外层函数调用后,外层函数作用域对象,被内层函数引用着,无法释放,就形成闭包对象—一句话概况闭包如何形成的
闭包三部曲:
1).用外层函数妈妈包裹要保护的变量和内层函数
2).外层函数用return把内层函数孩子返回到外部
3).外部想使用内层函数的人,必须先调用外层函数,才能获得return出来的内层函数对象.并将内层函数保存的一个变量中反复使用
闭包形成的原因:外层函数调用后,外层函数的作用域对象被内层函数引用着无法释放,就形成了闭包.(一句话概况)
闭包的缺点:闭包比一般的函数占用多一块内存一一外层函数的函数作用域对象.
解决: 如果一个闭包不打算使用了,应该及时释放!
保存内层函数的外部变量=null
释放了内层函数对象
同时也释放了外层函数的作用域对象。
<!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