作用:使用闭包主要是为了设计私有的方法和变量。优缺点:闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存的使用量,使用不当很容易造成内存泄漏。概念:在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>