关于闭包简单的理解

在日常的学习和开发中经常听到闭包的概念。一直是似懂非懂的状态。现在暂时将对闭包的理解记录下来,以供自己以后参考。
闭包我的理解就是函数之中套着的函数。说到闭包我想到了作用域链相关的知识。闭包可以使用外部函数的变量,而自己的变量不能被外部访问。举个例子方便自己说明。

var num=0;
function outer(){
	var  name="zxy";
	console.log(name);
	return function inner(){
		var age=23;
		console.log(age);
		console.log(name)
	}
}
outer() //zxy
var res= outer()
res()//23 zxy

我的理解是inner函数就是一个闭包。谈闭包先说作用域。全局的作用域链只有一个引用,它无法访问outer和inner函数中的相关变量。outer函数作用域链有两个引用,它可以访问全局和本身的作用域,却无法访问inner函数的作用域。in函数同理。当outer函数被调用时,console.log输出zxy并且outer返回一个inner函数。此时按以往的逻辑,outer函数调用完毕,作用域应该被销毁了。按理来说返回的inner函数只可以访问自己作用域中的age,无法访问被销毁的outer函数作用域中的name。然而结果却出人意料,这说明了什么呢?这说明虽然outer函数执行完了,但inner函数的作用域链中依然存在着对outer作用的引用。只有当inner函数被执行后,inner函数被释放,inner函数对outer函数的作用域的引用才会断开,此时outer的作用域才能被浏览器回收。内存得以释放。这就很好的解释了为什么不能滥用闭包。因为虽然外部函数执行完了,但内部的闭包可能因为某些原因并没有执行,那么对外部函数作用域的引用就没有断开,浏览器就无法对其进行回收。一旦太多的引用没有断开时,就会使可用的内存越来越少,造成所谓的内存泄漏。
以上就是我对闭包的浅层理解

猜你喜欢

转载自blog.csdn.net/wodegegeya/article/details/88676624