2012-05-31 9 views
5

Powiel możliwe:
What is the purpose of a self executing function in javascript?Celem "Self Wywoływanie Anonymous Funkcje"

Mam nadzieję, że dość proste pytanie do przodu:

Jaki jest cel stosowania siebie powołując anonimowy Funkcje? Czy chodzi po prostu o zapobieganie "zanieczyszczaniu" globalnego zasięgu zmiennymi itp.? Czy istnieją inne zalety korzystania z nich?

+1

Nazywa się to również IIFE. Zobacz http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

Odpowiedz

10

Z mojego osobistego doświadczenia, inne niż przy użyciu funkcji anonimowe do wywoływania zakres, mam również stosować go w for-pętle do zamknięcia. Może to być przydatne, gdy element DOM musi przechowywać swój licznik i nie masz dostępu do bibliotek takich jak jQuery itp.

Załóżmy, że masz elementy 100 DIV. Kliknięcie pierwszego DIV element powinien ostrzegać 1, podobnie klikając 56. elementu div powinny ostrzegać 56.

więc podczas tworzenia tych elementów, zazwyczaj zrobić coś takiego

// 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); 
    }; 
} 

będzie ten alert 99, w kasie jest obecnie 99. Wartość i nie jest tutaj zachowywana.

Jednak kiedy anonimowa funkcja jest wykorzystywana do rozwiązania problemu,

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

Tutaj wartość i utrzymuje się i jest wyświetlana poprawna liczba.

4

Czy chodzi po prostu o zapobieganie "zanieczyszczaniu" globalnego zasięgu zmiennymi itp.?

Dość dużo. Kapsułkowanie i unikanie jak największego stanu globalnego, jak to tylko możliwe, same w sobie są dobrymi celami.

+0

Coś, co jest bardziej zrozumiałe. – NaveenDA

3

Jest stworzenie własnego zakresu. Jest to nie tylko lepsze, ponieważ już nie "zanieczyszczasz" innego (na przykład globalnego) zakresu, daje ci to gwarancję ucieczki przed problemami związanymi z kolizją nazw i obroną przed programistami, którzy lubią za dużo intrygować wewnątrz swoich funkcji/obiektów/metod wśród wszystkich korzyści. Pozwala także GC łatwo zrozumieć, że nie potrzebujesz już żadnych obiektów, do których się odwołujesz, kiedy funkcja jest już wykonana.

0

Closures in for-loops również używać samodzielnie wywoływania anonimowych funkcji.

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); 
    } 
}