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

时间:2019-04-04 13:52:11

标签: javascript closures

我在JS中读了一些关于closures的文章。 我在这本https://medium.freecodecamp.org/javascript-closures-simplified-d0d23fa06ba4

中经历过各种指南

我仍然有一个问题。闭包是否仅引用一阶函数(返回函数的函数)。或者,任何功能是closure吗? 我真正看到的唯一区别是某些函数没有嵌套,这3个作用域链(外部函数的作用域)之一仍然是空的,但它仍然不存在。

2 个答案:

答案 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值只能由内部函数或嵌套函数访问。

这是呼叫关闭。单个函数不能为闭包。也应该有一个外部词汇环境。