2009-12-24 8 views

Respuesta

17

Esta es una forma estándar de hacer espacios de nombres en JavaScript. Si acaba de declarar

var my_cool_variable = 5; 

será global y podría entrar en conflicto con otras bibliotecas, que utilizan la misma variable.

Sin embargo, si lo hace

(function() { 
    var my_cool_variable = 5; 
})(); 

ahora es variable local para la función anónima y no es visible fuera del alcance de esa función. Todavía puede exponer la API accesible al no indicar var al frente de la variable, de esa manera será global, pero ahora tiene una opción.

2

En un nivel simple que mantiene el espacio de nombres global limpia (er)

es decir:. es efectivamente añadiendo una capa de envolver alrededor de las funciones y variables dentro de la biblioteca, por tanto, asegurar que no hay ningún enfrentamientos de espacio de nombres con otras funciones que pueden ser en uso desde otras bibliotecas, etc.

7

If forces scope declaration. Al ponerlo en una función, se asegura de que las variables que crea y llama no se vuelvan a declarar o no se invoquen accidentalmente variables que se declaran en otro lugar.

así .....

var variable = 5; // this is accessible to everything in the page where: 

function() 
{ 
    var variable = 7 // this is only available to code inside the function. 
} 

Aquí hay un enlace al sitio de Douglas Crockford hablando de alcance en Javascript:

http://javascript.crockford.com/code.html

hacer un seguimiento de los comentarios a continuación:

El alcance de JavaScript está un poco "roto":

function() 
{ 
    var x = 3; // accessible in the entire function. 
    //for scope reasons, it's better to put var y = 8 here..... 
    if(x != 4) 
    { 
     var y = 8; //still accessible in the entire function. 
        //In other languages this wouldn't be accessible outside 
        //of the if statement, but in JavaScript it is. 

    } 

} 
+1

porque javascript tiene alcance de función pero no alcance de bloque. : D –

+0

¿Crees que está roto? ¿Qué hay de la idea de W3C de alcance variable: teniendo en cuenta este ejemplo, si el valor de 'x' se cambia dentro del bloque' if (x! = 4) {..} ', el cambio se verá dentro de ese bloque, pero no fuera de él ni después de eso. – Esko

1

JavaScript no tiene ámbito de bloques, solo ámbito de funciones. Al crear e invocar de forma inmediata una función anónima, podemos garantizar que sus variables locales no pasen por todo el espacio de nombres global. Básicamente es una forma de limitar conflictos con otras bibliotecas que pueden estar en juego.

0
var $={} // a name space is defined 

(function($) { 
     $.a_variable="some vale" 
     var b_variable = "some more value"; 
})($); 

$.a_variable // acess it like this. 

ahora cualquier cosa dentro de la función anónima tiene un alcance igual a la función sólo También podemos crear objetos que pueden actuar como propiedades a nuestro espacio de nombre.

Cuestiones relacionadas