2009-07-31 16 views
8

Mi consulta se utiliza en los casos en que "(function() {...})();" Dado que no soy un complemento. Por ejemplo "http://piecesofrakesh.blogspot.com/2009/03/downloading-javascript-files-in.html"¿Cuándo debería usar la sintaxis "(function() {...})();"?

(function() {   
    var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
    ]; 

    var sc = "script", tp = "text/javascript", sa = "setAttribute", doc = document, ua = window.navigator.userAgent; 

    for(var i=0, l=s.length; i<l; ++i) { 
    if(ua.indexOf("MSIE")!==-1 || ua.indexOf("WebKit")!==-1) { 
     doc.writeln("<" + sc + " type=\"" + tp + "\" src=\"" + s[i] + 
      "\" defer></" + sc + ">"); 
    } else { 
     var t=doc.createElement(sc); 
     t[sa]("src", s[i]); 
     t[sa]("type", tp); 
     doc.getElementsByTagName("head")[0].appendChild(t); 
    } 
    } 
})(); 

O

var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
]; 
... 

Gracias.

+9

¿Cuál es exactamente la pregunta? – Scoregraphic

+8

"Dado que no soy un complemento" es lindo :-) – balpha

+0

Lo siento, escribo muy mal en inglés. El script no es un complemento, en cuyo caso es útil usar esta estructura "(function() {...}();" –

Respuesta

24

Esto se hace para evitar conflictos de nombres.

Cuando declara una función, esa función tiene su propio espacio de nombres para las variables. Al envolver el código en una función que se invoca inmediatamente, evita sobreescribir las variables globales con sus propios valores.

En este caso s y sc tienen asignado un valor. Si lo hizo en el ámbito global y otros scripts ya estaban usando variables con esos nombres para un fin diferente, eso haría que esos otros scripts fallaran. Al introducir el nuevo ámbito, los identificadores s y sc ahora se refieren a variables diferentes (vinculadas localmente) que las variables llamadas s y sc que existen en el ámbito global.

+0

Gracias por su Respuesta –

+3

+1 por adivinar la pregunta de eso ... – Kip

2

Idiom (function() {...})(); límites alcance de sus variables. Por lo tanto, en el primer caso s (y sc, tp etc.) no será accesible desde ningún lugar fuera del cuerpo de la función. En el segundo caso, podrás acceder a él. Por lo tanto, (function() {...})(); lo protege de la contaminación del espacio de nombres. Si lo necesita, es otra pregunta. Puede querer google algo como "scope javascript". Hay un buen article.

+0

Gracias por su Respuesta –

3

(function() {...})(); es una función anónima autoinvocada, es decir, una función sin nombre que se ejecuta de forma inmediata. Dado que JavaScript tiene un alcance de función, el uso de funciones anónimas autoinvocadas limita el alcance de las variables dentro de la función a la función en sí, evitando así cualquier conflicto que pueda ocurrir.

En jQuery, una función anónima de invocación automática se utiliza con frecuencia por los autores de complementos para hacer referencia al objeto jQuery con el símbolo $ dentro de la función. Por ejemplo

(function($) { 

    /* plugin code here */ 

})(jQuery); 
Cuestiones relacionadas