一句话解释什么是JavaScript闭包

闭包是什么?
用我的话来讲,闭包是一种责任。高尚的道德操守。如果你生了什么东西(一些其他功能)在内部,你必须继续为他们提供他们使用和需要的东西。闭包是一种在javascript中具有道德行为,它对内在诞生的函数负责并提供值。那就是说函数内部可以访问全局变量

function a(){
	let person = 'sam'
	return function b(){
	let hobby = 'plays basketball'
	return function c(){
	let degree = 'very well'
	return `${person} ${hobby} ${degree}`
}
}
}

a()()() // sam plays basketball very well

在 Javascript 中,这里做了一些独特的事情。
闭包是JavaScript的一个功能,JavaScript 引擎将确保函数可以访问外部的所有变量。

如果运行a(),当调用过后应从call stack中弹出,并从变量环境里消除。为什么person函数没有被垃圾回收?因为它的内部函数c仍然引用着这个变量。

person依然存在,那是因为person进入了闭包这个盒子。

这个盒子就是内存堆memory heap,就是一堆内存,只要我们不再需要这些在内存中,就会被清除。

然而当垃圾回收机制看到了person这个函数,看到了在此有闭包,它说:‘嘿 这有闭包,我不能回收,因为内部有人还在引用这它。’

所以当我们调用b()的时候,调用下一个 b 函数,并将它添加到堆栈中,创建新的变量环境,我们有一个hobby,一旦我们删除hobby或一旦 b 弹出堆栈再次hobby正在被它内部的另一个函数引用。所以hobby被放进了闭包盒子中,紧接着 c函数被调用,我们有了变量degree。

最终到了return ${person} ${hobby} ${degree}, 并说好吧,让我们来看看person变量是什么,它会看看在变量环境中吗?并说不,我找不到它,但现在与其寻找全局范围或全局变量,而是看着这个闭包盒子,说我找到了person变量。
因为函数c内部没有function,当JavaScript引擎看到函数b会创建闭包,所有在c之外的变量,会被保存以便c使用。

你可能感兴趣的:(语言)