JavaScript 中的“闭包”到底指的是什么?

问题描述 投票:0回答:8

我理解闭包是什么,但我在理解术语

closure
到底指的是什么时遇到了一些困难。我在很多网站上看到过这个术语,但很少有人就它的实际定义达成一致。

  • 是保存在栈帧上的变量吗?
  • 这是正在返回的函数吗?
  • 是外层函数的作用域吗?
  • 它是内部(返回)函数的范围吗?
  • 这可能是返回函数后将变量保留在堆栈帧上的概念吗?

有人可以准确地告诉我

closure
指的是什么吗?

javascript closures definition
8个回答
46
投票

来自 JavaScript 闭包

两句话概括:

闭包是a的局部变量 功能 - 保持活动后 函数已返回,或者

闭包是一个堆栈框架,它是 函数执行时未释放 返回。 (就好像“堆栈框架”是 malloc'ed 而不是在 堆栈!)

一篇关于闭包的非常好的文章

Javascript 闭包

“闭包”是一个表达式 (通常是一个函数)可以有 自由变量与 绑定这些变量的环境 (“关闭”表达式)。

闭包的简单解释是 ECMAScript 允许内部 功能;函数定义和 里面的函数表达式 其他职能的职能机构。 这些内部函数是 允许访问所有本地 变量、参数和声明 其外部的内部功能 功能)。当以下情况时,形成闭包: 其中一个内部函数已完成 可以在函数外部访问 它被包含在内,以便它可以 在外部函数之后执行 已经回来了。这时候还是 可以访问局部变量, 参数和内部函数 其外部函数的声明。 那些局部变量、参数和 函数声明(最初)有 他们当时所拥有的价值观 返回的外部函数可能是 通过内部函数进行交互。

这里有一个很好的例子

JavaScript,是时候探索闭包了


6
投票

它是一个“保存”另一个范围内的某个或多个引用的函数。例如:

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

发生这种情况是因为当函数被“创建”时,它们不会复制 i 的值,它们保存对 i 的引用,因此当我们调用函数时,它们使用 i 的当前值,即 3。

这是图解说明。


4
投票

对我来说,JS 中的闭包允许您执行以下操作。
当添加到“b”时,“a”在内部函数中仍然可用,尽管它是在外部声明的。

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

对于 JS 闭包的极端用法,您可以查看 PURE 库(JS 模板引擎)的源代码


2
投票

据我所知,闭包是在另一个函数中定义的函数,该函数的生命周期超出了父函数的作用域。一个常见的例子是回调:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

在这种情况下,上面的

function closure
是在
delay_message
的主体内定义的,但函数定义以及父函数的变量
msg
- 超出了
delay_message
函数调用的范围。


2
投票

考虑以下代码,它创建了一个带有变量 a 和 b 的闭包

closure=(function(){ 

    var a=3
    var b=5 

return  function(operation){ 
          return operation(a,b)
      }
 }())


// The variables a and b are now part of the closure (They are retained even after the outer function returns)


closure(function(x,y){return x+y})  // outputs 8

closure(function(x,y){return x*y}) // outputs 15`

这个特定的闭包现在可以采用任何对变量 a 和 b 进行操作的函数


2
投票

闭包是从可能嵌套的函数声明或函数表达式(即 lambda 表达式)创建的函数值,其主体包含对外部作用域中声明的变量的一个或多个引用。


1
投票

本质上,闭包是一个对其本地环境中的标识符(变量)进行封闭的函数体。


0
投票

闭包是指一个函数(外层函数)包含另一个函数(内层函数)。

闭包用于保护数据。

下面提供的视频链接演示了 Closer 的使用:

https://www.youtube.com/watch?v=w1s9PgtEoJs

© www.soinside.com 2019 - 2024. All rights reserved.