2013-08-09 11 views
14
var ninja = (function(){ 
    function Ninja(){}; 
    return new Ninja(); 
})(); 

Dlaczego powyższa funkcja jest zamknięta w nawiasach i dlaczego na końcu znajduje się ();?Wyjaśnij następującą instrukcję JavaScript?

Myślę, że jest to funkcja konstruktora, ponieważ na końcu znajduje się ();, ale dlaczego obiekt jest zawijany w nawiasy okrągłe?

+0

proponuję lekturę, http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

Zobacz także: [jak działa funkcja anonimowa w JavaScript praca?] (http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work). –

+0

@KevinDeVoe Twój duplikat jest lepszy – Dave

Odpowiedz

7

Kod ten jest równoważny:

function Ninja() { 
    // nothing here 
} 

var ninja = new Ninja(); 

Chociaż w kodzie, który wpisałeś na listę, funkcja/obiekt Ninja nie ma zasięgu globalnego.

Kod (function() {...})(); w zasadzie mówi "weź dowolną funkcję zawartą tutaj i wykonaj ją natychmiast". Więc tworzy anonimową funkcję i wywołuje ją zaraz potem.

4

Nazywa się Immediately-Invoked Function Expression (lub IIFE). Tworzy nowy zakres i natychmiast wykonuje zawartość. Istnieje wiele zastosowań; najbardziej używam słowa kluczowego, gdy słowo kluczowe zmieniłoby się, np. w

var someClass = function() { 
    this.property = something; 
    this.update = (function(obj) { 
     function() { 
      $('.el').each(function() { 
       $(this).html(obj.property); 
      }); 
     }; 
    )(this); 
}; 

Chociaż chcę odnieść się do this.property wewnątrz $('.el').each(), this zmian intencje w tym zakresie i odnosi się do bieżącego elementu DOM, który jest przelotowe z .each(). Więc przekazując this jako parametr do IIFE (i wywołując ten parametr obj) mogę użyć obj.property, aby odnieść się do tego, co jest this.property, gdy wykracza poza zakres $('.el').each(..., function() { ... });.

Daj mi znać, jeśli to ma sens, lub jeśli masz jakieś pytania :)

0

Jak sugeruje: Odnosząc się do Benalman

Natychmiast-Wykonano Expression Funkcja (Iife) szczęście „fix” jest SyntaxError prosty. Najpowszechniej akceptowanym sposobem, aby parser oczekiwał wyrażenia funkcji, jest właśnie zawijanie w parens, ponieważ w JavaScript parens nie może zawierać instrukcji. W tym momencie, gdy analizator składniowy napotka słowo kluczowe function, wie, że należy go parsować jako wyrażenie funkcji, a nie deklarację funkcji.

// Każdy z poniższych dwóch wzorów może być użyty do natychmiastowego wywołania // wyrażenia funkcji, wykorzystując kontekst wykonania funkcji do // tworzenia "prywatności."

(function() {/ * kod * /}()); // Crockforda poleca ten

(function() {/ * kod * /})(); // Ale ten działa tak samo dobrze