什么是闭包?
闭包(closure)就是指一个函数有权访问另一个函数作用域中变量的函数,也就是说一个作用域可以访问另一个作用域中的局部变量
function fn(){
var num=10;
function fun(){
console.log(num);
}
fun();
}
fn();
在代码中fun可以访问fn函数中的变量num,一个函数只要访问了另一个函数的变量,就说有局部变量的产生,变量所在的函数就说闭包
闭包的作用
延伸了变量的作用范围,
避免命名冲突,
解决循环绑定引发的索引问题,
变量不会被销毁,可以使用函数内部的变量,使变量不会被垃圾回收机制回收
闭包也可以是高阶函数
function fn() {
//这里的闭包也是高阶函数
return function(){
console.log(num);
}
}
var f = fn();
f();
高阶函数形成条件:
1.函数作为参数传递
2.函数作为返回值返回
闭包的应用
例子:定时器中的闭包
<ul class="nav">
<li>榴莲</li>
<li>芒果</li>
<li>葡萄</li>
<li>山竹</li>
</ul>
<script>
let lis=document.querySelector(".nav").querySelectorAll("li");
for(let i = 0;i<lis.length;i++){
(function(i){
setTimeout(function(){
console.log(lis[i].innerHTML);
}
})(i)
}
</script>
闭包的应用:
设计模式中的单例模式
for循环中保留 i 的操作
防抖和节流
函数柯里化
缺点:会出现内存泄漏问题