你不知道的——JavaScript闭包

闭包是JavaScript中关键的概念,它允许内部函数访问并操作外部函数的作用域。在示例中,foo()函数内的bar()函数形成了一个闭包,保持对外部变量a的访问权限,即使foo()执行完毕,bar()仍能记住foo()的作用域。这个特性避免了内存的过早回收,使得bar()在之后的调用中依然能够访问foo()的局部变量。
摘要由CSDN通过智能技术生成

目录

  • 引言:对于JavaScript来说,理解闭包可以看作是某种意义上的重生。JavaScript中闭包无处不在,并不是一个需要学习的新语法或模式才能使用的工具。我们总是在无意识中使用着闭包。

理解闭包

  • 如下代码清晰地展示了闭包:
function foo() {
	var a = 2;
	function bar() {
		console.log(a);
	}
	return bar;
}

var baz = foo();
baz(); // 2 -- 这就是闭包的效果
  • 解释:

  • 函数bar()的词法作用域能够访问foo()的内部作用域。我们将bar()函数本身当作一个值类型进行传递。在这个例子中,我们将bar所引用的函数对象本身当作返回值。

  • 在foo()执行后,其返回值(也就是内部的bar()函数)赋值给变量baz并调用baz(),实际上只是通过不同的标识符引用调用了内部的函数bar()

  • bar()显然可以被正常执行。但在这个例子中,它在自己定义的词法作用域以外被执行。

  • 在foo()执行后,通常会期待foo()的整个内部作用域都被销毁,因为我们知道引擎有垃圾回收器用来释放不再使用的内存空间。

  • 由于看上去foo()的内容不会再被使用,所以很自然地会考虑对其进行回收。而闭包的“神奇”之处正是可以组织这件事情的发生。事实上内部作用域依然存在,因此没有被回收。谁在使用这个内部作用域?bar()本身在使用。

  • 拜bar()所声明的位置所赐,它拥有涵盖foo()内部作用域的闭包,使得该作用域能够一直存活,以供bar()在之后任何时间进行引用。

  • 闭包是什么?:bar()依然持有对该作用域的引用,而这个引用就叫做闭包。

  • 摘取自《你不知道的JavaScript》

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值