<!DOCTYPE html>
<html>
<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>闭包函数</title>
</head>
<body>
<script>
function a(){
console.log('a函数被调用了...');
let num1 = 100
let num2 = 200
function b(){
console.log('b函数被调用了...');
console.log(num1 + num2);
}
//返回的返回值也是一个函数,那么a函数,就是高阶函数。
return b
}
// 通常情况下,函数执行完成后,函数里面定义的变量,会被销毁。
// a函数,已经调用完毕了,但是a函数里面定义变量,始终在内存中,因为b函数中用到了a函数中定义的变量。
// 那么此时这两个函数,就称之为:闭包函数。
let c = a()
c()
console.log('------------------------------------------');
// 闭包函数的实际案例
function calc(num1,num2,type){
switch(type){
case '+':
console.log(`${num1}+${num2}=${num1+num2}`);
break;
case '-':
console.log(`${num1}-${num2}=${num1-num2}`);
break;
}
}
// 在实际开发中,我们在做num1和num2的计算之前,可能需要先做其他事情
let num1 = 100
let num2 = 50
// 在做其他事情的过程中,我们的数据很有可能会被篡改。
console.log('查看用户是否登录');
num1 = 555
num2 = 145
console.log('检查用户的权限');
calc(num1,num2,'+') //运行结果不对,因为变量的值被篡改了。
console.log('------------------------------------------');
// 定义一个闭包函数,实现计算器功能
function myCalc(num1,num2,type){
switch(type){
case '+':
return function(){
return num1 + num2
}
case '-':
return function(){
return num1 - num2
}
}
}
//先准备好你的数据
let n1 = 100
let n2 = 50
//将你的数据传给计算器方法,由计算器方法,返回一个计算方法。
let js = myCalc(n1,n2,'+')
//在做具体的计算之前,还先做些其他的事情
console.log('查看用户是否登录');
n1 = 555
n2 = 145
console.log('检查用户的权限');
//其他事件准备好了后,执行计算方法
console.log(js());
</script>
</body>
</html>