您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

JavaScript闭包如何工作?

JavaScript闭包如何工作?

闭包是以下内容的配对:

词法环境是每个执行上下文(堆栈框架)的一部分,并且是标识符(即局部变量名称)和值之间的映射。

JavaScript中的每个函数都对其外部词汇环境保持引用。此引用用于配置调用函数时创建的执行上下文。此引用使函数内部的代码可以“查看”在函数外部声明的变量,而不管调用函数的时间和位置。

如果一个函数一个函数调用,而另一个函数调用了另一个函数,则将创建对外部词汇环境的引用链。该链称为作用域链。

在下面的代码中,innerfoo调用时创建的执行上下文的词法环境形成一个闭包, 变量进行 闭包secret

function foo() {

  const secret = Math.trunc(Math.random()*100)

  return function inner() {

    console.log(`The secret number is ${secret}.`)

  }

}

const f = foo() // `secret` is not directly accessible from outside `foo`

f() // The only way to retrieve `secret`, is to invoke `f`

换句话说:在JavaScript中,函数带有对私有“状态框”的引用,只有它们(以及在相同词法环境中声明的任何其他函数)可以访问。状态框对于函数调用者是不可见的,从而为数据隐藏和封装提供了一种出色的机制。

请记住:JavaScript中的函数可以像变量一样传递(一流的函数),这意味着功能和状态对可以在程序中传递:类似于在C ++中传递类的实例的方式。

如果JavaScript没有闭包,则必须在函数之间 显式 传递更多状态,从而使参数列表更长,代码更嘈杂。

因此,如果您希望函数始终有权访问私有状态,则可以使用闭包。

......频频我们 希望与功能关联状态。例如,在Java或C ++中,当您将私有实例变量和方法添加到类时,您正在将状态与功能相关联。

在C语言和大多数其他常见语言中,函数返回后,所有本地变量将不再可访问,因为堆栈框架被破坏了。在JavaScript中,如果您在另一个函数中声明一个函数,则外部函数的本地变量在返回后仍可访问。这样一来,在上面的代码secret仍然可用的函数对象inner之后 它已经从返回foo

每当需要与函数关联的私有状态时,闭包都是有用的。这是一种非常常见的情况- 请记住:JavaScript直到2015年才使用类语法,并且仍然没有私有字段语法。封闭件可满足此需求。

javascript 2022/1/1 18:19:01 有514人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶