我理解闭包是什么,但我在查找closure
这个术语的确切含义时遇到了一些麻烦。我已经看过许多网站上使用的术语,但他们很少同意它的实际定义。
有人能告诉我closure
指的是什么吗?
答案 0 :(得分:45)
两个一句话摘要:
闭包是a的局部变量 功能 - 保持活力 函数已返回,或
闭包是一个堆栈框架 当功能没有解除分配 回报。 (好像是'堆叠框架' malloc'ed而不是在 栈!)
关于闭包的非常好的文章
“闭包”是一种表达方式 (通常是一种功能)可以拥有 自由变量和 绑定这些变量的环境 (“关闭”表达式)。
关闭的简单解释是 ECMAScript允许内部 功能;功能定义和 内部的函数表达式 其他功能的功能体。 那些内在的功能是 允许访问所有本地 变量,参数和声明 内在的功能在他们的外部 功能)。闭合时形成 其中一个内部功能是 在函数外部可访问 包含它,以便它可以 在外部函数之后执行 已经回来了。它仍然存在 有权访问局部变量, 参数和内在功能 声明其外部功能。 那些局部变量,参数和 函数声明(最初)有 当他们拥有的价值观 返回外部函数,可能是 与内在的功能相互作用。
这里的一个很好的例子
答案 1 :(得分: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。
答案 2 :(得分:4)
对我来说,JS中的闭包可以让你做到以下几点 当添加到“b”时,“a”在内部函数中仍然可用,尽管它在外部声明。
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
对于JS闭包的极端用法,您可以查看PURE库的source code(JS模板引擎)
答案 3 :(得分:2)
据我所知,闭包是在另一个函数中定义的函数,它比父函数的作用域更长。一个常见的例子是回调:
function delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
在这种情况下,上面的function closure
是在delay_message
的主体内定义的,但是函数定义 - 以及父函数的变量msg
- 超出了范围delay_message
函数调用。
答案 4 :(得分: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进行操作的函数
答案 5 :(得分:1)
本质上,闭包是在其本地环境中关闭其标识符(变量)的函数体。
答案 6 :(得分:1)
闭包是从嵌套函数声明或函数表达式(即lambda表达式)创建的函数值,其主体包含对外部(但不是全局)作用域中声明的变量的一个或多个引用。
答案 7 :(得分:0)
关闭表示包含另一个功能(内部功能)的功能(外部功能)。
关闭用于保护数据。
在下面的视频链接中介绍了使用closer的情况: