闭包的含义
官方定义:闭包就是函数内部的函数。
是不是有点难理解?没事,小编在这里给大家解释一下。
函数A里面嵌套着函数B,函数B能够访问到函数A外部的变量,并且形成了一个不会销毁的函数空间,这就是闭包。
故,形成闭包有三个必备的条件:
- 在函数 A 内部直接或者间接返回一个函数 B
2. B 函数内部使用着 A 函数的私有变量(私有数据)
3. A 函数外部有一个变量接收着函数 B
注意:以上条件缺一不可!!!
闭包的作用
既然了解了闭包,那总得知道闭包在我们的开发工作中有什么作用吧。比如当你需要延长变量的生命周期或者你需要访问某一个函数内部的私有数据的时候,你就可以使用闭包来解决。话不多说,我们直接举例说明。
代码一:
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
</body>
<script>
var btns = document.querySelectorAll('button')
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function () {
console.log(i)
}
}
</script>
效果:
点击以上按钮你会发现,无论你点击哪个按钮,后台打印出来的都是4。只是因为,我们这串代码这有 i=0,i=1,i=2,i=3 这4个内容,无论你有没有点击按钮for循环都会执行,当你点击按钮时,for循环已经执行完毕,i的值已经循环到5了,所有你每次点击的时候都会打印5。
那如果想达到我们预想中的结果,点击1的时候打印0,点击2的时候打印1,点击3的时候打印2,点击4的时候打印4,那这个时候我们就得用到闭包函数了。
代码二:
<body>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
</body>
<script>
var btns = document.querySelectorAll('button')
function A(j){
btns[j].onclick = function(){
console.log(j);
}
}
for(var i=0;i<btns.length;i++){
A(i)
}
</script>
效果:
代码二就是利用了我们的闭包来延长变量的周期,这样我们预想的结果就出来啦。
闭包引发的问题
我们的闭包虽然好用,但是好东西也会存在缺点。
- 每形成一个闭包,就会形成一个不会被销毁的空间,那么占用的内存就会过多, 如果过多,
就会导致内存溢出,那最终导致的结果是内存泄漏。听起来是不是很恐怖,所有当我们遇到问题的时候,不要着急使用闭包函数,有别的办法就用别的办法解决,实在没有办法的时候,再使用闭包。总之,要慎用!!!
闭包的特点
闭包函数不仅强大,它的特点也是和特殊的。闭包是属于优点和缺点并存,下面,小编就给大家总结一下闭包函数的特点。
-
延长了变量的生命周期
优点: 因为执行空间不销毁, 变量也没有销毁
缺点: 因为执行空间不销毁, 会一直存在在内存中 -
可以访问函数内部的私有变量
优点: 利用闭包函数可以访问函数内部的私有变量
缺点: 执行空间不会销毁, 会一直存在在内存中 -
保护私有变量(只要是函数, 就有这个特点)
优点: 保护私有变量不被外界访问
缺点: 如果向访问, 必须要利用闭包函数
家中逆战,无畏疫情,武汉加油,中国加油,人类必胜!!!