2009-03-30 7 views
16

estoy aprendiendo YUI y han visto de vez en cuando este idioma:JavaScript idioma: Crear una función sólo para alegar ésta

<script> 
    (function x(){ do abcxyz})(); 
</script> 

¿Por qué crear una función sólo para invocarlo? Por qué no acaba de escribir:

<script> 
    do abcxyz 
</script> 

Por ejemplo ver here.

+0

Ver también: http://stackoverflow.com/questions/631187/javascript-scope-and-closure/ –

Respuesta

44

Se están aprovechando de closures.

Breve explicación: Dado que JS usa el ámbito del nivel de función, puede realizar un conjunto de acciones dentro de una función y mantenerla en ese ámbito. Esto es útil para invocar código que no se meta con el espacio de nombres global. También le permite a uno hacer variables privadas: si declara una variable dentro de una función anónima y la ejecuta inmediatamente, solo otro código dentro de la función anónima puede acceder a esa variable.

Por ejemplo, supongamos que quiero hacer un generador de identificador único global. Se podría hacer un código como éste:

var counter = 0; 
var genId = function() 
{ 
    counter = counter + 1; 
    return counter; 
} 

Sin embargo, ahora cualquiera puede meterse con contador, y ahora he contaminado el espacio de nombres global con dos variables (contador y GenID).

En cambio, podría utilizar una función anónima para generar mi función de contador:

var genId = function() 
{ 
    var counter = 0; 
    var genIdImpl = function() 
    { 
     counter = counter + 1; 
     return counter; 
    } 

    return genIdImpl; 
}(); 

Ahora, sólo tengo una variable en el espacio de nombres global, lo cual es ventajoso. Más importante aún, la variable de contador ahora está a salvo de modificaciones, solo existe en el ámbito de la función anónima, por lo que solo la función genIdImpl (que se definió en el mismo ámbito) puede acceder a ella.

Parece que en el código de ejemplo de YUI, solo quieren ejecutar código que no contamine el espacio de nombres global.

3

Quieren evitar las colisiones del espacio de nombres, supongo. Parece una buena práctica en JS.

Cuestiones relacionadas