2012-03-16 10 views
10

Badając skrypty plusone google, widziałem wiele razy następującą składnię:Jaki jest powód używania takiej składni (0, _.Em)();

(0, _.Em)(); 

Zakładając _.Em jest funkcją oświadczenie powyżej spowoduje wywołanie tej funkcji, to dość oczywiste. Jeśli, z drugiej strony, byłaby ona niezdefiniowana, czy wynik nie byłby taki sam, jak po prostu _.Em()?

Czy ktoś może rzucić światło na to, co kryje się za tą składnią?

+0

Zobacz także [Czy operator przecinka wpływa na kontekst wykonywania w JavaScript?] (Http://stackoverflow.com/q/36076794/1048572) – Bergi

Odpowiedz

8

Zasadniczo ta składnia pozwala zadzwonić _.Em() w kontekście window obiektu zamiast _.

zakładając, że masz ten kod:

Foo = function() { 
    this.foo = "foo"; 
}; 

Foo.prototype.Em = function() { 
    alert(this.foo); 
}; 

var _ = new Foo(); 

Wydawanie _.Em() spowoduje Em() są nazywane w kontekście _. Wewnątrz funkcji słowo kluczowe this będzie się odnosić do _, więc zostanie wydrukowane foo.

Wydanie (0, _.Em)() oddziela wywołanie metody od obiektu i wykonuje wywołanie w kontekście globalnym. Wewnątrz funkcji słowo kluczowe this będzie się odnosić do window, więc zostanie wydrukowane undefined, ponieważ window nie ma właściwości foo.

Możesz sprawdzić różnicę między dwiema składniami w this fiddle.

+0

Ale dlaczego '(0, _.EM)()' działa jak że? – Niko

+5

Ponieważ ocena '_.Em', to zastosowanie operatora połączenia nie jest takie samo jak bezpośrednie wywołanie' _.Em() '. Ocena '_.Em' niezależnie zwraca" wolną funkcję ", z braku lepszego terminu, i ta funkcja nie będzie już związana z obiektem" _ ". Ten sam wynik można uzyskać, pisząc 'var f = _.Em; f(); '. W obu przypadkach słowo kluczowe 'this' będzie odnosiło się do' okna' zamiast '_' wewnątrz funkcji. –

+0

+1, dobra odpowiedź. Chciałbym dodać, że jest to chyba najbardziej bezsensowna forma syntaktycznego słodzenia, jaką kiedykolwiek widziałem w JS. '(0,)()' ma dokładnie taką samą długość jak '.call()', więc nie ma zapisywania bajtów, chyba że usuniesz spację po przecinku (a nawet wtedy jest tylko jeden). Kosztem wprowadzenia w błąd niczego nie podejrzewających deweloperów, naprawdę nie wydaje się warto używać takiej składni. –

Powiązane problemy