我一直在阅读关于JS中的闭包的相关内容。我参考了多种指南,例如这个https://medium.freecodecamp.org/javascript-closures-simplified-d0d23fa06ba4
然而,我仍有一个问题。闭包是否仅适用于一阶函数(返回函数的函数)?或者,任何函数都是闭包吗? 实际上唯一不同的区别在于某些未嵌套的函数,其中3个作用域链之一(外部函数的作用域)可能为空但它仍然存在。
我一直在阅读关于JS中的闭包的相关内容。我参考了多种指南,例如这个https://medium.freecodecamp.org/javascript-closures-simplified-d0d23fa06ba4
然而,我仍有一个问题。闭包是否仅适用于一阶函数(返回函数的函数)?或者,任何函数都是闭包吗? 实际上唯一不同的区别在于某些未嵌套的函数,其中3个作用域链之一(外部函数的作用域)可能为空但它仍然存在。
闭包是通过调用函数来创建的;函数本身不是闭包。从概念上讲,每次函数调用都会隐式地产生一个新的闭包。对于某些函数,闭包是短暂的,并在函数返回后立即消失:
function add2(n) {
return n + 2;
}
那个函数只返回一个数字;在函数调用创建的闭包中,没有任何东西可以引用它,所以闭包消失了,你只剩下了返回值。
当一个函数返回某些具有一个或多个“钩子”进入函数调用时创建的本地环境的内容时,闭包变得有趣。(函数还可以通过修改全局环境来公开闭包。)所以这个函数:
function addn(addend) {
return function(n) {
return n + addend;
}
}
返回的函数引用了外部函数的参数,因此将闭包暴露出来。
我无法想象一个普通函数如何暴露一个闭包,而不涉及一个或多个函数引用局部上下文(参数、变量)。 (生成器函数很有趣,因为 yield
总是返回一些暴露闭包的东西,我想。)
function greet(Say){
return (
function(name){
console.log(Say + ' ' + name);
}
)
}
greet('Hi')('Alex')
var sayGreet = greet('Hi');
sayGreet('Alex')
console.log(Say + " " + name)
。我们知道name
是Alex,但Say
呢?此时没有Say
的任何迹象,因为greet函数已经执行完毕并返回了一个函数。
尽管JavaScript仍然可以引用Say值,即使它已经完成执行。这个Say
值只能被内部函数或嵌套函数访问。
这就是闭包。单个函数不能成为闭包。也应该有一个外部词法环境。