在 JavaScript 中“闭包”究竟指的是什么?

我知道闭包是什么,但是我在理解术语 closure到底指的是什么方面遇到了一些困难。我在很多网站上看到过这个词,但是他们很少同意它的实际定义。

  • 是保存在堆栈框架中的变量吗?
  • 是要返回的函数吗?
  • 是外部函数的作用域吗?
  • 它是内部(返回)函数的作用域吗?
  • 也许是返回函数后在堆栈框架上保持变量的 概念

谁能告诉我 closure指的是什么?

16975 次浏览

来自 JavaScript 闭包

两个一句话的摘要:

闭包是 后仍然存活 函数已返回,或

闭包是一个堆栈框架,它是 当函数 返回。(仿佛一个’堆栈框架’ 而不是在 栈!)

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

Javascript 闭包

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

闭包的简单解释是 ECMAScript 允许内部 函数; 函数定义和 内部的函数表达式 其他函数的函数体。 这些内部功能是 允许访问所有本地 变量、参数和声明的 它们外部的内部功能 函数。当 其中一个内部功能 中函数外部可访问的 它被控制了,所以它可能 在外部函数之后执行 已经回来了。在这一点上,它仍然 可以访问本地变量, 参数和内部函数 外部函数的声明。 那些局部变量,参数和 函数声明(最初)具有 时它们所拥有的值 外部函数返回,并且可能是 内部函数相互作用。

这里有个很好的例子

JavaScript,时间到 grok 闭包

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

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

在本例中,上面的 function closure是在 delay_message的主体中定义的,但是函数定义——以及父函数的变量 msg——超出了 delay_message函数调用的范围。

它是一个函数,用来“保存”另一个作用域中的某个引用。例如:

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。

这里有一个图解。

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

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

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

从本质上讲,闭包是在其本地环境中封闭在其标识符(变量)之上的函数体。

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

考虑下面的代码,它创建了一个包含变量 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 的函数

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

闭包用于保护数据。

视像连结示范如何使用接近器,可提供以下连结:

Https://www.youtube.com/watch?v=w1s9pgteojs