闭包
定义
function csdn() {
let n = 1;
return function sum() {
console.log(++n);
}
}
函数可以访问到其他函数作用域中的数据
产生闭包的条件
· 函数嵌套
· 内部函数引用了外部函数的数据(变量/函数)
· 外部函数被调用
闭包的作用
· 使用函数内部的变量在函数执行完后,任然存活在内存中
· 让函数外部可以操作到函数内部的数据(变量/函数)
闭包的声明周期
产生:嵌套的内部函数在定义时就产生了
死亡:在嵌套的内部函数成为垃圾对象时
闭包的应用
let btns = document.querySelectorAll('button');
btns.forEach(item=>{
let bind = false; //设置节流阀
item.addEventListener("click",function(){
if(!bind) {
bind = true; //当重复点击按钮是,一下代码不再执行
let left = 1;
setInterval(function(){
item.style.left = left++ + "px"; //闭包的产生
},100)
}
})
})
function order( field, type = "asc" ) {
return function( a,b ) {
if(type = "asc") return a[field] > b[field] ? 1 : -1; //闭包的产生
return a[field] > b[field] ? -1 : 1;
}
}
let csdn = lesson.sort(order("price", "asc"));
闭包的缺点
· 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
· 造成内存泄漏(及时释放,赋值null)