闭包
/*
闭包:
概念:暂未释放的一个函数执行空间
作用:被用于存储私有数据,不污染外界,避免命名冲突
典型用法:闭包内存数据,对外返回该数据的操作API; 函数式编程中作为高阶函数去加工一个入参的函数
注意事项:闭包持续不释放会形成一定的内存压力,用完了以后对其返回值置空以释放闭包,避免内存泄露
*/
/*
函数式编程
概念:基于纯函数+闭包,实现函数的自由组合与变换
作用:函数的可复用性高,复杂的业务逻辑拆解为不同环节的流水线作业,便于阅读与维护
典型用法:组合、管道、柯里化、Promise化、函数缓存、只执行一次的函数...
注意事项:闭包+函数嵌套+递归 频繁切换上下文/作用域 时间空间开销均比较大 性能不如命令式编程
*/
<!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>
<input type="text" name="" id="ip" placeholder="请输入要查询的学生姓名">
<button id="btnSet">设置成绩</button>
<button id="btnGet">查询成绩</button>
<p id="pInfo">成绩显示区</p>
<script>
function scrore(name) {
const scores = {
chinese: 0,
math: 0,
coding:0,
};
return {
set(key,value) {
scores[key] = value;
},
getAll() {
return `${name}:${JSON.stringify(scores)}`;
},
get(key) {
return scores[key];
}
};
}
</script>
<script>
const arr = ["张三疯","尼古拉斯赵四","隔壁老王"]
const obj = {}
arr.forEach(
name => obj[name] = scrore(name)
)
console.log(obj);
btnSet.onclick = function(){
let [name,key,value] = ip.value.split(":")
// arr.push(name)
obj[name].set(key,value)
}
btnGet.onclick = function() {
const name = ip.value
pInfo.innerText = obj[name].getAll()
}
</script>
</body>
</html>
<!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 account(name,money) {
return function(n) {
money += n
console.log(name,"的最新余额是",money);
}
}
const saveFn1 = account("张三",1)
saveFn1(5000,99)
</script>
<script>
function account(name,money) {
return{
// 存钱
save:function(n) {
money += n
},
// 取钱
withdraw:function(n){
money -= n
return n
},
// 查询余额
query:function() {
return money
}
}
}
let zs = account("张三",0)
zs.save(100)
zs.withdraw(99)
let zsquery = zs.query()
console.log(zsquery);
// zs = null //释放闭包函数
// console.log(account());
</script>
<script>
</script>
</body>
</html>

浙公网安备 33010602011771号