javascrip 的闭包详解

本文详细介绍了JavaScript中的闭包概念,包括其工作原理、代码示例和常见问题。通过示例展示了如何使用闭包解决变量作用域问题,并讨论了闭包在内存管理和防抖节流等场景中的应用。同时,提到了闭包的优缺点,帮助读者深入理解闭包并提升编程技巧。
摘要由CSDN通过智能技术生成

引言

相信在面试的小伙伴都遇到过问关于闭包的问题,刚刚接触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

闭包的优缺点

优点:可以将变量保存在某个作用域中不被销毁以维持某种状态,以至于我们随时可以使用该变量;将变量保存在指定作用域中以供我们使用,防止对全局造成污染。

缺点:使得某个函数的执行上下文不能得到及时销毁或者不销毁,以导致内存的泄露和占用大量内存,严重可能会导致内存的溢出

结尾

相信看完这篇文章的小伙伴一定对闭包有了更深的了解。感谢你们的观看,希望这篇文章能给你带来一些帮助,如果有小伙伴有一些问题或者疑惑,欢迎提出和分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值