What exactly does "closure" refer to in JavaScript?
I understand what closures are, but I am having some trouble grokking exactly what the term closure
refers to. I have seen the term used in many websites, but rarely do they agree on the actual definition of it.
Can someone tell me exactly to what closure
refers to?
From JavaScript Closures
Two one-sentence summaries:
A closure is the local variables for a function - kept alive after the function has returned, or
A closure is a stack-frame which is not deallocated when the function returns. (as if a 'stack-frame' were malloc'ed instead of being on the stack!)
A very good article on closures
Javascript Closures
A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression).
The simple explanation of a Closure is that ECMAScript allows inner functions; function definitions and function expressions that are inside the function bodies of other functions. And that those inner functions are allowed access to all of the local variables, parameters and declared inner functions within their outer function(s). A closure is formed when one of those inner functions is made accessible outside of the function in which it was contained, so that it may be executed after the outer function has returned. At which point it still has access to the local variables, parameters and inner function declarations of its outer function. Those local variables, parameter and function declarations (initially) have the values that they had when the outer function returned and may be interacted with by the inner function.
A good example over here
JavaScript, time to grok closures
It's a function that "holds" a reference or references to something in another scope. For example:
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
This happens because when the functions are "created", they do not copy the value of i, they hold a reference to i, so when we call the functions they use the current value of i which is 3.
Here is a graphical explanation.
For me, the closures in JS allows you to do the following.
"a" remains available in the inner function when added to "b" although it is declared outside.
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
For an extreme usage of JS closures, you can have a look at the source code of the PURE library (a JS templating engine)
链接地址: http://www.djcxy.com/p/51610.html上一篇: 最小可行的JavaScript关闭