js学习之闭包与作用域链

本文深入探讨JavaScript中的闭包概念,解释其产生原因及作用域链的工作原理。阐述闭包在函数累加、缓存结构、封装和模块化中的应用,同时指出其可能导致的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                         闭包与作用域链

 在学习js过程中会,必定要知道和明白的闭包。闭包是与其他编程语言相比,是js中所特有的一个。以下就是我对于闭包的认识。

闭包的产生:通俗的说,闭包产生于多个函数嵌套之间,当内层函数被保存到外面时,从而导致其内层函数所产生的作用域链也被保存到函数外部,闭包就会产生。

作用域链:我的理解是当多个函数嵌套生成时,其函数所在的作用域之间会产生一个链式访问的过程。从而就产生了一个作用域链

在这段代码中,会产生如下图所示的一个作用域链生成的过程

下面我们就来说一下闭包的作用

闭包的好处:

第一:函数的累加         第二:缓存结构    第三:封装   第四模块化

闭包的坏处:

闭包会导致原有作用域链不释放,造成内存泄漏。

下面就是几个闭包的实际例子:

  

在这个闭包的例子中,如果没有return b语句,调用这个函数时,f()的值只能为342;当有了这条语句后,所打印出来的值依次是增加的,这个就是闭包所产生的一个效果。

当执这段代码时,你会发现你所打印出来的结果为10个10,可是为什么会产生这种效果呢?然后又要怎么解决这种效果呢?

当执行这段代码时,你就会发现此时打印出来的结果就为0到9一次从小到大输出。

产生上述的10个10的原因其实就是因为闭包所导致的,其中

arr[i] = function(){ document.write(i + " ")  }   此语句为函数表达式,此时arr[i]与document.write(i + " ") 不是想对应的,document.write(i + " ") 为输出语句,因为该数组中所存方法被保存到了外部,该方法在for循环结束后后并没有去执行这里面的函数体中这条输出语句,当在外部被调用时,这里的i已经变成了for循环结束后的结果10,因此在外部执行时,去访问到的是在该函数所在的作用域中的内容,此时的i为10,那么其所打印的结果就为10个10

下面为什么会打印出0到9这10个数呢,在这里就利用了立即执行函数,

立即执行函数的量两种形式:(function (){}();   (function (){})(); 通常采用第一种。

那什么是立即执行函数呢,其实可以将其概括为只执行一次的函数,当执行完一次后,不能调用不能执行。因此,在后面输出0到9这过程中,由于此时的i为实参,每一次传到立即执行函数里面时,j就是此时i的值,只是整个表达式还没有执行而已。所以到最后输出的时候就自然而然的输出了0到9这10个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值