引言
相信在面试的小伙伴都遇到过问关于闭包的问题,刚刚接触js
的小伙伴可能不太能理解,其实只要我们对函数的执行足够了解,闭包的问题也就很容易理解了,下面带你轻松拿捏闭包。
关于函数的执行
在了解闭包之前,我们需要对函数的执行有所理解。函数每执行一次都会开辟一个新的地址(执行上下文),因此一个函数每次调用时产生的变量都是不同的。
function a(){let a,b}
a()
a()
图解:每次产生的执行上下文都是相互独立的。函数执行完毕后,如果不存在闭包
,执行上下文会被立马销毁即该内存会得以释放,销毁后也就意味着该上下文中的变量都会被重置。
什么是闭包
函数每执行一次都会开辟一个新的地址,如果我们一直执行的是某个函数内部存在的函数,那么系统就会在外部函数的地址中开辟多个地址,同时内部函数必须要对外部函数的变量有引用,这样外部函数的地址就不会被销毁,这就是闭包。
闭包代码示例
// 不使用闭包时
function fun(){
let i=1
console.log(++i);
}
fun() //2
fun() //2
fun() //2
// 使用闭包后
function out() {
let i=1
return function(){
console.log(++i);
}
}
const internal=out()
internal() //2
internal() //3
internal() //4
现象解释
使用闭包后,外部函数的执行上下文没有被销毁,使得外部函数的变量得以保存下来。
图解:闭包产生后,无论内部函数何时执行,变量i
一直存在着,且值没有被重置。
学习中常见的闭包问题
for(var i=0;i<5;i++){
setTimeout(() => {
console.log(i);
}, 1000);
}
//结果 5 5 5 5 5
// 使用闭包解决问题
for(var i=0;i<5;i++){
(function(i){
setTimeout(() => {
console.log(i);
}, 1000);
})(i)
}
// //结果 0 1 2 3 4
闭包的主要作用及使用场景
闭包的主要作用就是保存某个变量,使得该变量不被销毁重置。使用场景如:在防抖节流中使用闭包来保存timerId
。
闭包的优缺点
优点:可以将变量保存在某个作用域中不被销毁以维持某种状态,以至于我们随时可以使用该变量;将变量保存在指定作用域中以供我们使用,防止对全局造成污染。
缺点:使得某个函数的执行上下文不能得到及时销毁或者不销毁,以导致内存的泄露和占用大量内存,严重可能会导致内存的溢出
结尾
相信看完这篇文章的小伙伴一定对闭包有了更深的了解。感谢你们的观看,希望这篇文章能给你带来一些帮助,如果有小伙伴有一些问题或者疑惑,欢迎提出和分享。