我眼中的闭包
是什么
闭包是一个特殊的对象, 函数嵌套,内部函数,引用了外部函数中的变量 产生了引用关系,此时就是闭包
function fun1() {
let a = 0
function fun() {
console.log(++a);
}
return fun
}
let fu=fun1()
fu()//调用函数使用闭包
作用
函数内部的数据是私有的,但是函数每次执行他所创建的变量对象都会被销毁,利用闭包,产生的引用关系,可以延长变量对象的生命周期,
保护他内部的变量不受干扰。
通过函数返回的引用变量,间接访问函数内部数据。
function fun1() {
let a = 0
function fun() {
console.log(++a);
}
return fun
}
let fu=fun1()
fu()//调用函数使用闭包 1
fu()//调用函数使用闭包 2
fu()//调用函数使用闭包 3
fu()//调用函数使用闭包 4
fu = null 切断引用使其被垃圾回收机制回收
- 同样闭包的优点就是他的缺点,保存变量对象 需要内存,会造成内存泄漏。所以不使用时要及时清除闭包
产生
闭包是在外部函数执行时,执行内部函数定义时产生,如何是函数声明要到执行哪一行才会产生,声明的话是预解析,在堆空间中创建函数,发现他使用了外部函数的变量,就给他分配一块,外部函数变量对象的地址,
应用
利用闭包保存循环的值
for(var i = 0; i <5; i++){
((i)=>{
setTimeout(() => {
console.log(i);
}, 0);
})(i) // 利用闭包缓存i
}
封装一下函数会非常有用 ,一个函数就是一个功能模块
function bind(callBack,obj,...args) {
return function (...arg) {
return callBack.call(obj,...args,...arg)
}
}