我了解闭包是什么,但我在理解该术语的确切含义时遇到了一些麻烦closure
。我在许多网站上看到过这个术语,但他们很少同意它的实际定义。
- 是保留在堆栈帧上的变量吗?
- 是返回的函数吗?
- 它是外部功能的范围吗?
- 它是内部(返回)函数的范围吗?
- 是否可能是在返回函数后将变量保留在堆栈帧上的概念?
有人能准确地告诉我closure
指的是什么吗?
我了解闭包是什么,但我在理解该术语的确切含义时遇到了一些麻烦closure
。我在许多网站上看到过这个术语,但他们很少同意它的实际定义。
有人能准确地告诉我closure
指的是什么吗?
两句话总结:
闭包是函数的局部变量 - 在函数返回后保持活动状态,或者
闭包是一个堆栈帧,在函数返回时不会被释放。(好像“堆栈帧”被分配而不是在堆栈上!)
关于闭包的一篇非常好的文章
“闭包”是一个表达式(通常是一个函数),它可以具有自由变量以及绑定这些变量(“关闭”表达式)的环境。
闭包的简单解释是 ECMAScript 允许内部函数;其他函数的函数体内的函数定义和函数表达式。并且允许这些内部函数访问其外部函数中的所有局部变量、参数和声明的内部函数。当其中一个内部函数可以在包含它的函数之外访问时,就会形成一个闭包,这样它就可以在外部函数返回后执行。此时它仍然可以访问其外部函数的局部变量、参数和内部函数声明。那些局部变量,
一个很好的例子在这里
它是一个“保存”对另一个范围内某物的引用或引用的函数。例如:
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 中的闭包允许您执行以下操作。
当添加到“b”时,“a”在内部函数中仍然可用,尽管它是在外部声明的。
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
对于 JS 闭包的极端用法,您可以查看PURE 库(JS 模板引擎)的源代码
据我所知,闭包是在另一个函数中定义的函数,它的寿命超过了父函数的范围。一个常见的例子是回调:
function delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
在这种情况下,上述function closure
内容是在 的主体中定义的delay_message
,但函数定义——以及父函数的变量msg
——超出了delay_message
函数调用的范围。
考虑以下代码,它使用变量 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 进行操作的函数
本质上,闭包是在其本地环境中的标识符(变量)上封闭的函数体。
闭包是从嵌套函数声明或函数表达式(即 lambda 表达式)创建的函数值,其主体包含对在外部(但不是全局)范围中声明的变量的一个或多个引用。
闭包意味着一个函数(外部函数)包含另一个函数(内部函数)。
闭包用于保护数据。
在下面提供的视频链接中演示了 close 的使用: