2012-04-27 30 views
6

En Javascript, ¿cuál es la diferencia entre un espacio de nombres y un cierre? Parecen muy similares a mí.Javascript: ¿diferencia entre el espacio de nombres y el cierre?

EDITAR

En concreto, se analiza this article espacios de nombres y cierres, y tiene frases como

Ahora, todavía vamos a tener situaciones en las que vamos a querer declarar variables que Don naturalmente encaja en un objeto de espacio de nombres estructura. Pero no queremos que esas variables tengan un alcance global. Aquí es donde funciones de auto-invocando vienen en.

Se va a dar lo que se parece mucho a un cierre, como un "espacio de nombres de objeto". Me parece que el espacio de nombres ES un closure ... pero tal vez no es ...? ¿Ayuda?

+1

Elabore su definición de "espacio de nombres". –

+0

Javascript no tiene espacios de nombres. ¿Qué quieres decir con ese término? –

+1

No hay un significado único de "espacio de nombres" en javascript porque hay muchas maneras de realizar la tarea de separar símbolos en espacios (incluso con cierres). Muestra un código –

Respuesta

23

Un espacio de nombres es esencialmente un Object sin propiedades interesantes que usted empuja cosas en lo que no tiene un montón de variables con similar y/o nombres de conflicto que se ejecutan alrededor de su alcance. Así, por ejemplo, algo así como

MyNS = {} 
MyNS.x = 2 
MyNS.func = function() { return 7; } 

Un cierre es cuando una función 'retiene' los valores de las variables que no están definidas en el mismo, a pesar de que esas variables han ido fuera de alcance. Tomemos el siguiente:

function makeCounter() { 
    var x = 0; 
    return function() { return x++; } 
} 

Si dejo c = makeCounter() y luego llamar repetidamente c(), voy a conseguir 0, 1, 2, 3, .... Esto se debe a que el alcance de la función anónima interna que makeCounter define 'cierra' en x, por lo que tiene una referencia, aunque x está fuera del alcance.

Cabe destacar que, si a continuación, haga d = makeCounter(), d() empezará a contar desde 0. Esto se debe a c y d obtener diferentes instancias de x.

+0

Esta es una muy buena respuesta, ¡gracias! Voy a darle un poco de tiempo sin embargo :) – Ben

+0

+1 Finalmente entiendo cierres (y he intentado como 2-3 tutoriales y siempre me rendí) – ajax333221

+0

Sí, esta es la explicación más concisa y útil de los cierres que he visto - ¡gracias! Ahora lo entiendo. – iono

5

Un espacio de nombre suele ser un método para poner todas sus variables globales como propiedades en una variable global maestra, por lo que solo se agrega una nueva variable global verdaderamente de nivel superior. Evita la contaminación del espacio de nombre global y reduce la posibilidad de conflicto con otras variables globales.

y el ejemplo de un espacio de nombres:

var YUI = {}; 
YUI.one = function(sel) {...}; 
YUI.two = function(sel) {...}; 
YUI.three = function(sel) {...}; 

Hay un nuevo elemento en el espacio de nombres global de nivel superior YUI, pero hay varios elementos globalmente accesibles a través del objeto de espacio de nombres YUI.

Un cierre es un bloque de función que dura más allá del final normal de la ejecución de la función debido a referencias duraderas a las partes internas de la función.

function doSometing() { 
    var x = 10; 
    setTimer(function() { 
     // this gets called after doSomething() has finished executing 
     // but because of the function closure, the variables 
     // inside of the parent scope like x are still accessible 
     x += 10; 
    }, 1000); 
} 
2

De http://jibbering.com/faq/notes/closures/:

Un cierre está formado por devolver un objeto de función que se ha creado dentro de un contexto de ejecución de una llamada de función de dicha llamada de función y la asignación de una referencia a esa función interna a una propiedad de otro objeto. O asignando directamente una referencia a dicho objeto de función a, por ejemplo, una variable global, una propiedad de un objeto accesible globalmente o un objeto pasado por referencia como un argumento a la llamada de función externa.

Los espacios de nombre son solo una convención, objetos creados para evitar saturar el alcance global con variables.

+0

Bienvenido a SO, @GeoffreyHing! Gracias por la ayuda, pero me parece que el párrafo de "cierre" es demasiado complicado y extremadamente confuso ... pero la explicación del espacio de nombres es clara y concisa, +1. – Ben

Cuestiones relacionadas