我理解什么是闭包,但我有些难以理解术语 closure
的确切含义。我在许多网站上看到这个术语,但他们很少在实际定义上达成一致。
- 它是保留在堆栈框架上的变量吗?
- 它是被返回的函数吗?
- 它是外部函数的作用域吗?
- 它是内部(返回的)函数的作用域吗?
- 也许它是保持变量在返回函数后仍留在堆栈框架中的概念吗?
有人能告诉我 closure
到底指的是什么吗?
我理解什么是闭包,但我有些难以理解术语 closure
的确切含义。我在许多网站上看到这个术语,但他们很少在实际定义上达成一致。
有人能告诉我 closure
到底指的是什么吗?
两个简短的概括:
闭包是函数的局部变量 - 在函数返回后仍然存在,或者
闭包是一个堆栈帧,它在函数返回时不会被释放。(就像一个“堆栈帧”被malloc而不是在堆栈上!)
一个非常好的关于闭包的文章
"闭包"是一个表达式(通常是一个函数),它可以有自由变量和一个绑定这些变量的环境(“封闭”该表达式)。
一个闭包的简单解释是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
对我来说,JS中的闭包允许您执行以下操作。
尽管"a"是在外部声明的,但它仍然在内部函数中添加到"b"时可用。
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
如果想要深入了解JS闭包的用法,可以查看PURE库(一个JS模板引擎)的源代码
closure
指的是什么。 - Andreas Grechfunction delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
函数闭包
)是在解析时创建的,但此时还没有闭包。当 function delay_message
执行并将其状态绑定到 函数闭包
时,才创建闭包。 - intgrclosure=(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`
本质上,闭包是一个函数体,在其本地环境中关闭其标识符(变量)。
闭包指的是一个包含另一个函数(内部函数)的函数(外部函数)。
闭包用于保护数据。
下面提供的视频链接演示了闭包的使用: