首先要明白闭包的存在是干什么用的,他就是用来解决变量的全局污染问题,当你给一个函数定义一个专属的且可以复用的变量,只有函数自己可以用,别人不可以用时,就用闭包!
闭包三步走
- 用外层函数包裹要保护的变量和使用变量的内层函数
- 在外层函数内部,返回内层函数对象。
- 调用外层函数,用变量接住返回的内层函数对象。
<!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>
function mother(){
var total=1000;
return function (money){
total-=money;
console.log(`还剩余${total}`);
}
}
var pay=mother();
// 用变量接住返回的内层函数对象
pay(100);
</script>
</body>
</html>
其次还有一种写法,就是用匿名函数来写,然后在自调用,
<!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>
(function () {
// JS引擎非常现实: 只有有用的东西 才会保存下来, 否则会统统删除
//所以要想使它存活下来,就必须要想办法使用它
var name = "我想要存活下来,便于后面函数调用发挥作用";
function show() {
console.log(name);
}
// window一直存活, 把show保存给window, show就能活下来
// show函数中 使用了name 变量, name有用, 就会活下来
window.show = show;
// 不保存到window 就无法调用show
// 在调用 window 中的内容
})();
//var 一般声明的变量就保存在window中,所以可以直接将函数的返回值赋给一个变量,
var show =(function () {
var name = "我想要存活下来,便于后面函数调用发挥作用";
return function show() {
console.log(name);
}
})();
show();
show();
</script>
</body>
</html>