Javascript JS中的每个函数都是闭包吗
我在JS中读了不少关于Javascript JS中的每个函数都是闭包吗,javascript,closures,Javascript,Closures,我在JS中读了不少关于closures。 我已经通过了各种各样的指南,就像这本一样 不过我还有一个问题。闭包是否只引用一阶函数(返回函数的函数)。或者,任何函数都是闭包? 我所看到的唯一区别是,对于一些没有嵌套的函数,3个作用域链(外部函数的作用域)中的一个将是空的,但它仍然不存在。通过调用函数创建闭包;函数本身不是闭包。从概念上讲,每个函数调用都会隐式地导致新闭包的出现。对于某些函数,闭包是短暂的,并且在函数返回时立即消失: function add2(n) { return n + 2;
closures
。
我已经通过了各种各样的指南,就像这本一样
不过我还有一个问题。闭包是否只引用一阶函数(返回函数的函数)。或者,任何函数都是闭包
?
我所看到的唯一区别是,对于一些没有嵌套的函数,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');
此行将返回字符串'Hi Alex'
现在我要做这样的事情
greet('Hi')('Alex')
var sayGreet = greet('Hi');
如果我使用console.log(sayGreet),它将是一个函数
现在告诉我这个变量是在哪里定义的?这是在全球一级。或者换句话说,在全局执行上下文中
现在我们来做
sayGreet('Alex')
在这个sayGreet函数中,我们有一个console.log(比如+“”+name)
。我们知道名字是亚历克斯,但是说什么呢?此时没有Say
的迹象,因为greet函数已经完成了执行并返回了一个函数
尽管javascript仍然能够引用Say值。即使它完成了执行。该值只能由内部函数或嵌套函数访问
这是通话结束。单个函数不能是闭包。也应该有一个外部的词汇环境。注意,在我写的第一段“概念上”——如果运行时发现闭包不能公开,它可以自由地进行优化。在最后一段中,我考虑的是一个返回对象(或对象结构)的函数只涉及局部变量的引用等;我想不出有什么理由要求闭包本身保持“活动”。我们可以说,无论我们在哪里使用函数的引用来使用该函数的作用域,我们都在那里使用闭包。要使用引用,我们要么返回对象,要么从父函数返回另一个函数。