su bastante simple, se trata de un clon de un espacio de nombres anidados, por lo que su tipode lo contrario de la teoría del compilador en que es tiempo de ejecución asignado espacio de nombres, que se utiliza para resolver las búsquedas de símbolos, en comparación con el lenguaje compilado que recoge símbolos en los desplazamientos estáticos.
pero básicamente todo lo que significa es que la búsqueda de símbolos se produce en una lista vinculada de los espacios de nombres, empezando por el espacio de nombres local, hasta los espacios de nombres incluidos (los cierres).
y en javascript el espacio de nombres es sólo un objeto con un recuento de referencia de cualquier función abiertas con una referencia a ese espacio de nombres
por ejemplo
var links = //a list of links identified set somehwere else
for(var i = 0, l = 3; l--; i++){
(function(n){
links[i].onclick = function(){ alert(n); }
})(i)
}
en el código anterior, enlaces [i] se utiliza para acceder a la matriz, pero en el momento en que se hace clic en el enlace, i se habrá incrementado y por lo tanto no el mismo número que el enlace. por lo tanto, n se configura en un espacio de nombres principal, de modo que cuando se activa la alerta (n) sea precisa.
global
|
|\
| +-- function(n=0) <- link0.onclick = function()
|\
| +-- function(n=1) <- link1.onclick = function()
\
+-- function(n=2) <- link2.onclick = function()
esto se bifurca en 3 marcos de pila, uno para cada iteración de i. y la función en el lado derecho de la expresión hte 'onclick =' tiene una referencia al marco de la pila ya que es un elemento léxico principal, donde comienza su búsqueda de símbolos.
finalmente terminarán mirando el mismo espacio de nombres porque comparten un abuelo.
algunos enlaces:
https://developer.mozilla.org/en/a_re-introduction_to_javascript
este esquema mínimo es mucho más fácil de leer que las fuentes V8:
http://code.google.com/p/chibi-scheme/
[Este artículo] (http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html) es un clásico. –