当前位置: 首页 > 知识库问答 >
问题:

每个函数都是闭包吗?

茅桐
2023-03-14

只是想知道,因为闭包是一个函数,它引用了定义之外的变量/方法。每个函数都关闭在程序的全局变量上(基本上在每种主流语言中,不管是JavaScript/Python/C/C+/whatever)。因此,每个函数都是闭包?

编辑:让我再次强调,我不只是在谈论javascript中的闭包,而是在一个更一般的上下文中

共有2个答案

督俊雅
2023-03-14

是的,完全正确。正如您所指出的,JavaScript中的每个函数都是至少一个上下文上的闭包:全局上下文。这就是全局变量在JavaScript中工作的方式/原因。

我们通常不称它们为闭包,除非它们在其他上下文中关闭,并且实际上利用了它们关闭的事实,但是在技术层面上,它们都是闭包,这是非常正确的。

每个函数都关闭在程序的全局变量上(基本上在每种主流语言中,不管是JavaScript/C/C+/whatever)。

我不会一概而论,不。不同的语言有不同的实现全局变量的方式。这些语言中的函数是否都是“闭包”可能还有待讨论,因此我将以上的答案限制在JavaScript上。

孟安民
2023-03-14

闭包是一个函数,它引用了定义之外的变量/方法

不,这是一个“带有自由变量的函数”,而不是一个“闭包”。

引用维基百科

。。。闭包只有在非局部变量的作用域之外时才不同于带有自由变量的函数,否则定义环境和执行环境重合,没有什么可以区分它们(静态绑定和动态绑定无法区分,因为名称解析为相同的值)。

换句话说,在某些上下文中,闭包是对某个函数的引用,该函数绑定了来自另一上下文的变量。否则,称之为“关闭”就说不通了。

 类似资料:
  • 问题内容: 我知道JavaScript中的每个函数都是一类对象,并且它具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。但是,有两种特殊情况。 由Function构造函数创建的函数也是闭包吗?由函数构造函数创建的函数对象是特殊的,因为其[[scope]]可能不引用其外部函数的词法环境,而仅引用全局上下文。例如, 这是不直观的。这也称为关闭吗? 如果内部函数没有任何自由变量,我们

  • 我试图使用web控制台获取页面上所有h2标记中的文本。 我所发现的就是使用每一种,我已经试过了 但是它返回

  • 闭包(closure)在 Rust 中也称为 lambda,是一类捕获封闭环境的函数。例如,一个可以捕获 x 变量的闭包如下: |val| val + x 它们的语法和能力使它们在临时(on the fly)使用相当方便。调用一个闭包和调用一个函数完全相同。然而,输入和返回类型两者都可以自动推导,且输入变量名必须指明。 其他的特点包括: 使用 || 替代 () 将输入变量括起来。 区块定界符({}

  • 问题内容: 我写的是,我正在使用Netbeans向每个函数添加类似专业的注释。因此,我从每一个开始,然后按来让Netbeans完成用于以下功能的默认注释方案。 到现在为止,我一直只在PHP语言中使用它,在这种情况下,如果遵循PHP函数确实包含了声明,则Netbeans始终仅在注释方案中添加部分。在所谓的“过程”(不返回任何值的函数)上,缺少此部分。 今天,我为Javascript函数尝试了同样的事

  • 主要内容:Python闭包的__closure__属性前面章节中,已经对 Python 闭包做了初步的讲解,本节将详解介绍到底什么是闭包,以及使用闭包有哪些好处。 闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。 例如,计算一个数的 n 次幂,用闭包可以写成下面的代码: 运行结果为: 4 8 在上面程

  • 5.4* 闭包函数 自 Vim8,进一步扩展与完善了函数引用的概念,并增加了对闭包与 lambda 表达式的支 持。请用 :version 命令确认编译版本有 +lambda 特性支持。 闭包函数定义 学习 Vim 新功能,在线帮助文档是最佳资料。查阅 Vim8 的 :help :function,可发 现在定义函数时,除了原有的几个属性 range abort dict 外,还多了一个 clos

  • Go支持匿名函数,匿名函数可以形成闭包。闭包函数可以访问定义闭包的函数定义的内部变量。 示例1: package main import "fmt" // 这个"intSeq"函数返回另外一个在intSeq内部定义的匿名函数, // 这个返回的匿名函数包住了变量i,从而形成了一个闭包 func intSeq() func() int { i := 0 return func() i

  • 我有一个使用SpringLDAP 1.3.1的应用程序。它在启动时在Spring上下文中创建LdapTemplate,并将其传递给我的应用程序。我连接的LDAP字符串实际上是一个VIP设备,后面有多个Active Directory服务器。 该应用程序用于创建组层次结构,并分几个步骤进行。首先,它创建任何新组,然后删除任何删除的组,然后更新和更改组,最后更新任何新组或移动组的父级。 在最后一步中,