2012-05-31 10 views
5

Duplicar posibles:
What is the purpose of a self executing function in javascript?La finalidad de las "funciones de auto Invocación Anónimo"

Con suerte una pregunta recta hacia adelante bastante:

¿Cuál es el propósito de usar auto invocando el anonimato funciones? ¿Es simplemente para evitar "contaminar" el alcance global con variables, etc.? ¿O hay otras ventajas de usarlos?

+1

Esto también se llama un IIFE. Ver http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

Respuesta

10

Fuera de mi experiencia personal, con excepción de usar funciones anónimas para inducir un ámbito, también lo han utilizado en fines de bucles de cierre. Esto puede ser útil cuando un elemento DOM necesita almacenar su conteo y no tiene acceso a bibliotecas como jQuery, etc.

Digamos que tiene un 100 DIV elementos. Al hacer clic en el primer elemento de DIV debería alertar a 1, al hacer clic de manera similar al elemento div 56a debe alertar 56.

Por eso, cuando la creación de estos elementos, que normalmente haces algo como esto

// Assume myElements is a collection of the aforementioned div elements 

for (var i = 0; i < 100; ++i) { 
    myElements[i].onclick = function() { 
     alert('You clicked on: ' + i); 
    }; 
} 

Esto alertará a 99, ya que el contador actualmente es 99. El valor de i no se mantiene aquí.

Sin embargo, cuando una función anónima se utiliza para abordar el problema,

for (var i = 0; i < 100; ++i) { 
    (function(count){ 
    myElements[count].onclick = function() { 
     alert('You clicked on: ' + count); 
    }; 
    })(i); 
} 

Aquí el valor de i se mantiene y se muestra el número correcto.

4

¿Es simplemente para evitar "contaminar" el alcance global con variables, etc.?

Pretty much. La encapsulación y evitar tanto estado global como sea posible son buenas metas en sí mismas.

+0

Creo que es más comprensible. – NaveenDA

3

Es crear su propio alcance. No solo es mejor porque ya no "contaminas" algún otro ámbito (por ejemplo, global), sino que te ofrece un escape garantizado para los problemas de colisión de nombres y defensa de los programadores que les gusta meter demasiado adentro las funciones internas de los objetos/métodos. entre todos los beneficios. También permite que GC entienda fácilmente que ya no necesita ningún objeto de referencia cuando la función está lista.

0

Closures in for-loops también utilizan las funciones anónimas auto invocadas.

function attachEventsToListItems() { 
    var oList = document.getElementById('myList'); 
    var aListItems = oList.getElementsByTagName('li'); 
    for(var i = 0; i < aListItems.length; i++) { 
     var oListItem = aListItems[i]; 
     // Watch this: 
     oListItem.onclick = (function(value) { 
      return function() { 
       alert(value); 
      } 
     })(i); 
    } 
} 
Cuestiones relacionadas