作用:使用闭包主要是为了设计私有的方法和变量。
优缺点:闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存的使用量,使用不当很容易
造成内存泄漏。
概念:在JavaScript中,函数即闭包,只有函数才会产生作用域。(函数被引用包围)
闭包有3个特性:
(1)函数嵌套函数
(2)在函数内部可以引用外部的参数和变量
(3)参数和变量不会被垃圾回收机制回收
<!-- 闭包:
1、数据的隐藏 --不希望数据被外部访问
2、做一个 cache 缓存 --小工具
-->
<!--
闭包:
1、局部变量 2、返回值是函数
-->
<script>
function create(){
let a = 100;
console.log(a);
}
// 当函数调用完毕之后 a 的内存会马上释放
</script>
<!-- 闭包:
当不希望一个变量造成全局污染,又要常驻内存,可以使用闭包
-->
<script>
function create(){
let a = 100;
return function(){
console.log();
}
}
var fn = create();
fn();
// fn是全局变量,它没有调用a的内存就不会被释放掉
</script>
闭包函数
<script>
// 使用一个闭包函数,可以设置和获取内存,但没办法直接获取内容
function createCache(){
const data = {} //闭包中的数据是隐藏的,不return外部无法直接访问
return {
set:function(key,val){
data[key] = val
},
get:function(key){
return data[key]
}
}
}
var obj = createCache();
obj.set("name","dai");
obj.set("age",18);
console.log(obj.get("name"));
console.log(obj.get("age"));
</script>
闭包封装函数防抖
<button id="btn">btn</button>
<script>
var btn = document.getElementById("btn");
btn.addEventListener("click",debounce(function(){
console.log(this.id);
}));
function debounce(fn,delay=500){
let timer = null;
return function(){
if(timer){
clearTimeout(timer);
}
timer = setTimeout(()=>{
fn.apply(this)
},delay)
}
}
</script>