What exactly does "closure" refer to in JavaScript?

JavascriptClosuresDefinition

Javascript Problem Overview


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.

  • Is it the variables that are kept on the stack frame?
  • Is it the function that is being returned?
  • Is it the scope of the outer function?
  • Is it the scope of the inner (returned) function?
  • Is it maybe the concept of keeping the variables on the stack-frame after returning the function?

Can someone tell me exactly to what closure refers to?

Javascript Solutions


Solution 1 - Javascript

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

Solution 2 - Javascript

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.

Solution 3 - Javascript

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)

Solution 4 - Javascript

As far as I can tell, a closure is a function defined within another function that outlives the parent function's scope. A common example is callbacks:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

In this case, the above function closure is defined within the body of delay_message, but the function definition -- as well as the parent function's variable msg -- outlive the scope of the delay_message function call.

Solution 5 - Javascript

Consider the following code that creates a closure with variables a and 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`

This particular closure can now take any function that operates on the variables a and b

Solution 6 - Javascript

Essentially a closure is a function body closed over its identifiers (variables) within its local environment.

Solution 7 - Javascript

A closure is a function value created from a nested function declaration or function expression (i.e. lambda expression) whose body contains one or more references to variables declared in an outer (but not global) scope.

Solution 8 - Javascript

Closure means a function(outer function) containing another function(inner function).

Closure is used to protect the data.

the use of closer is demostrated in the video link provide below:

https://www.youtube.com/watch?v=w1s9PgtEoJs

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndreas GrechView Question on Stackoverflow
Solution 1 - JavascriptrahulView Answer on Stackoverflow
Solution 2 - JavascriptDaniel RodriguezView Answer on Stackoverflow
Solution 3 - JavascriptMicView Answer on Stackoverflow
Solution 4 - JavascriptintgrView Answer on Stackoverflow
Solution 5 - Javascriptsarath josephView Answer on Stackoverflow
Solution 6 - JavascriptMark UrsinoView Answer on Stackoverflow
Solution 7 - JavascriptTheodore NorvellView Answer on Stackoverflow
Solution 8 - JavascriptAbhishek-SainiView Answer on Stackoverflow