If everything seems completely unclear then
the best thing to do is to play with the examples. Reading an explanation is
much harder than understanding examples.
My explanations of closures and stack-frames etc are not technically correct
- they are gross simplifications intended to help understanding. Once the
basic idea is grokked, you can pick up the details later.
- Whenever you use function inside another
function, a closure is used.
- Whenever you use eval() inside a
function, a closure is used. The text you eval can reference local
variables of the function, and within eval you can even create new local
variables by using eval('var foo = …
- When you use Function() inside a
function, it does not create a closure. (The new function cannot reference
the local variables of the function calling
variables, just as they were when a function exited.
- It is probably best to think that a closure is always created just on
entry to a function, and the local variables are added to that closure.
- A new set of local variables is kept every time a function with a
closure is called (Given that the function contains a function declaration
inside it, and a reference to that inside function is either returned or
an external reference is kept for it in some way).
- Two functions might look like they have the same source text, but have
completely different behaviour because of their 'hidden' closure. I don't
closure or not.
- If you are trying to do any dynamic source code modifications ( for
example: myFunction =
Function(myFunction.toString().replace(/Hello/,'Hola')); ), it
won't work if myFunction is a closure (Of course, you would never even
think of doing source code string substitution at runtime, but...).
- It is possible to get function declarations within function
declarations within functions - and you can get closures at more than one
- I think normally a closure is the term for both the function along
with the variables that are captured. Note that I do not use that
definition in this article!
in functional languages.