我在JS中读了一些关于closures
的文章。
我在这本https://medium.freecodecamp.org/javascript-closures-simplified-d0d23fa06ba4
我仍然有一个问题。闭包是否仅引用一阶函数(返回函数的函数)。或者,任何功能是closure
吗?
我真正看到的唯一区别是某些函数没有嵌套,这3个作用域链(外部函数的作用域)之一仍然是空的,但它仍然不存在。
答案 0 :(得分:3)
通过调用函数创建闭包;函数本身不是闭包。从概念上讲,每个函数调用都会隐式地导致一个新的闭包出现。对于某些函数,闭包是短暂的,并且只要函数返回就消失:
function add2(n) {
return n + 2;
}
该函数仅返回一个数字;在函数调用创建的闭包中,没有任何东西可以引用任何东西,因此闭包消失了,剩下的就是返回值。
当函数向调用函数创建的本地环境中返回具有一个或多个“钩子”的东西时,闭包变得有趣起来。 (该函数也可以通过修改全局环境来公开闭包。)因此,此函数:
function addn(addend) {
return function(n) {
return n + addend;
}
}
公开闭包,因为返回的函数引用了外部函数的参数。
我想不出一种普通的函数可以公开一个闭包的方法,该闭包不以某种方式涉及某个或多个引用本地上下文(参数,变量)的函数。 (生成器函数很有趣,因为我猜想yield
类总是返回暴露闭包的东西。)
答案 1 :(得分:1)
闭包是函数的组合和声明该函数的词法环境
例如,
function greet(Say){
return (
function(name){
console.log(Say + ' ' + name);
}
)
}
现在我可以做类似的事情了
greet('Hi')('Alex')
此行将返回字符串'Hi Alex'
现在我要做这样的事情,
var sayGreet = greet('Hi');
如果我console.log(sayGreet),它将是一个函数。
现在告诉我这个sayGreet变量在哪里定义?在全球范围内。或换句话说,就是全局执行上下文。
现在开始吧
sayGreet('Alex')
在sayGreet函数中,我们有一个console.log(Say + " " + name)
。我们知道name
是亚历克斯,但是Say
呢?目前没有Say
的迹象,因为问候函数已经完成执行并返回了一个函数。
即使javascript仍具有引用Say值的能力。即使完成执行。此Say
值只能由内部函数或嵌套函数访问。
这是呼叫关闭。单个函数不能为闭包。也应该有一个外部词汇环境。