javascript - Mozilla 开发者网络上的嵌套函数和闭包的描述中缺少什么?

标签 javascript function closures

我觉得其中缺少了一些东西。这是:

嵌套函数和闭包

您可以在函数中嵌套函数。嵌套(内部)函数对其包含(外部)函数是私有(private)的。它还形成了一个封闭。闭包是一个表达式(通常是一个函数),它可以具有自由变量以及绑定(bind)这些变量的环境(“关闭”表达式)。

由于嵌套函数是一个闭包,这意味着嵌套函数可以“继承”其包含函数的参数和变量。换句话说,内部函数包含外部函数的范围。

总结一下:

  • 内部函数只能从外部函数中的语句访问 功能。
  • 内部函数形成一个闭包:内部函数可以使用外部函数的参数和变量,而外部函数可以使用外部函数的参数和变量。 函数不能使用内部的参数和变量 功能。

以下示例显示嵌套函数:

function addSquares(a,b) {
  function square(x) {
    return x * x;
  }
  return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41

由于内部函数形成闭包,因此您可以调用外部函数并为外部函数和内部函数指定参数:

function outside(x) {
  function inside(y) {
    return x + y;
  }
  return inside;
}
fn_inside = outside(3); // Think of it like: give me a function that adds 3 to whatever you give it
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8

最佳答案

闭包一开始肯定是一个令人困惑的话题,但实际上它可以归结为:

  1. 任何时候你有一个嵌套函数,从技术上讲你就有一个闭包。

  2. 仅仅因为您有一个闭包并不一定意味着您的代码会受到任何重大影响。

<强>3。当嵌套函数依赖于更高层函数(祖先函数)中声明的变量并且嵌套函数的生命周期比声明这些依赖变量的函数更长时,您就会遇到需要理解的闭包情况。

这些变量(在嵌套函数中使用,但在高阶函数中声明,又名自由变量)在声明它们的函数完成时不能被垃圾回收,因为嵌套函数需要它们比它的 parent /祖先更长寿。这种“过时”可能是由于嵌套函数被嵌套函数的父级返回给更高阶的调用者或嵌套函数被分配给另一个对象(如 DOM 对象)而引起的。

发生这种情况时,会在自由变量周围创建一个闭包,并且该变量的作用域现在也由依赖它的任何其他内存中函数共享。这会导致共享作用域,并且通常是本应获取其自身值的函数不会造成混淆的地方。在这些情况下,修改内部函数以接收祖先自由变量的副本可以解决这种困惑。

关于javascript - Mozilla 开发者网络上的嵌套函数和闭包的描述中缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821499/

相关文章:

c - 执行时间测量的通用功能

javascript - 在 get 请求的 do while 循环中使用闭包

java - 闭包意味着完全类型安全的标准?

swift - 为什么 DispatchSemaphore.wait() 会阻止这个完成处理程序?

javascript - 使用 jQuery/.data() 避免内存泄漏

javascript - 我如何在 Highchart 中使列和 y 轴之间有 1px 的空间?

javascript - 如何保存标记?

javascript - Node js Express尝试将orm json传递给客户端

c - 无法使功能正常工作,程序总是在提示后崩溃

c++ - 为什么这种声明函数的方式在 C++ 中已过时?