JS-闭包(closure)的理解

可能很多人在刚学js的时候都会听说过闭包,但是却完全不了解闭包是什么,当然我也在其中,其实闭包大量的存在在我们的代码中。我们缺少的是去识别闭包,拥抱闭包的思维。

!!!我们缺少的是根据自己的意愿来识别、拥抱和影响闭包的思维(划重点)

!!!闭包并不是什么高大上的技术

闭包是基于词法作用域书写代码时产生的自然结果,其实我们一直在很自然地在创建闭包
不信你看

function foo(){
	var a = 2;
	function bar(){
		console.log(a);
	}
	return bar;
}
var baz = foo();
baz();	//2——这就是闭包的效果

简单吧,你是不是写过很多次类似的代码,但是你却没有发现原来这就是闭包?

闭包的定义

当函数可以记住并访问所有在词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

在上面的栗子中,bar()依然持有对foo()内部作用域的引用,而这个引用就叫做闭包
如果觉得这样理解起来有点拗口,那可以这样理解——“闭包是定义在一个函数内部的函数”(百度百科给出的定义);不过我个人觉得这个定义有点狭隘了;

其实我们平时使用的很多回调函数,实际上都是在使用闭包!回头看看自己的代码,结合上面给出的定义,想想是不是这么一回事呢。

现在在回到本文开头看看划重点的地方,是不是突然恍然大悟了

ps: 函数的执行上下文,在执行完毕之后,生命周期结束,那么该函数的执行上下文就会失去引用。其占用的内存空间很快就会被垃圾回收器释放。可是闭包的存在,会阻止这一过程。所以我们调用baz()之后并且以后不再调用时,最好要释放掉占用的内存空间。

function foo(){
	var a = 2;
	function bar(){
		console.log(a);
	}
	return bar;
}
var baz = foo();
baz();	//2——这就是闭包的效果
baz = null;	//释放内存

猜你喜欢

转载自blog.csdn.net/Mr_lizi/article/details/83041722