Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中的每个函数都是闭包吗_Javascript_Closures - Fatal编程技术网

Javascript JS中的每个函数都是闭包吗

Javascript JS中的每个函数都是闭包吗,javascript,closures,Javascript,Closures,我在JS中读了不少关于closures。 我已经通过了各种各样的指南,就像这本一样 不过我还有一个问题。闭包是否只引用一阶函数(返回函数的函数)。或者,任何函数都是闭包? 我所看到的唯一区别是,对于一些没有嵌套的函数,3个作用域链(外部函数的作用域)中的一个将是空的,但它仍然不存在。通过调用函数创建闭包;函数本身不是闭包。从概念上讲,每个函数调用都会隐式地导致新闭包的出现。对于某些函数,闭包是短暂的,并且在函数返回时立即消失: function add2(n) { return n + 2;

我在JS中读了不少关于
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值。即使它完成了执行。该值只能由内部函数或嵌套函数访问


这是通话结束。单个函数不能是闭包。也应该有一个外部的词汇环境。

注意,在我写的第一段“概念上”——如果运行时发现闭包不能公开,它可以自由地进行优化。在最后一段中,我考虑的是一个返回对象(或对象结构)的函数只涉及局部变量的引用等;我想不出有什么理由要求闭包本身保持“活动”。我们可以说,无论我们在哪里使用函数的引用来使用该函数的作用域,我们都在那里使用闭包。要使用引用,我们要么返回对象,要么从父函数返回另一个函数。