我理解闭包是什么,但我在理解术语
closure
到底指的是什么时遇到了一些困难。我在很多网站上看到过这个术语,但很少有人就它的实际定义达成一致。
有人可以准确地告诉我
closure
指的是什么吗?
两句话概括:
闭包是a的局部变量 功能 - 保持活动后 函数已返回,或者
闭包是一个堆栈框架,它是 函数执行时未释放 返回。 (就好像“堆栈框架”是 malloc'ed 而不是在 堆栈!)
一篇关于闭包的非常好的文章
“闭包”是一个表达式 (通常是一个函数)可以有 自由变量与 绑定这些变量的环境 (“关闭”表达式)。
闭包的简单解释是 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 表达式)创建的函数值,其主体包含对外部作用域中声明的变量的一个或多个引用。
本质上,闭包是一个对其本地环境中的标识符(变量)进行封闭的函数体。
闭包是指一个函数(外层函数)包含另一个函数(内层函数)。
闭包用于保护数据。
下面提供的视频链接演示了 Closer 的使用: