2013-01-23 11 views
6

mam mnóstwo JavaScriptu od zarania dziejów z wywołań funkcji napisane tak:Wzory javascript: Kontekst Function Call

THING.someFunction.call(THING); 

Wydaje mi się, że zawsze powinny być równoważne:

THING.someFunction(); 

Czy te dwa połączenia są zawsze równoważne? Co ze starszymi wersjami JavaScript?

Wydaje mi się, że celem drugiego THING w tym pierwszym wierszu kodu jest ustawienie kontekstu (this) wewnątrz someFunction. Ale kontekst wewnątrz tej funkcji powinien być domyślnie ustawiony na THING, prawda?

Wystarczy być jasne, THING jest zdefiniowane tak:

var THING = function() { 
    // private vars 

    return{ 
     // code 
     someFunction : function() { 
      // code 
     } 
    }; 
}(); 
+2

Sposób, w jaki teraz masz swój kod, "THING.someFunction" jest "niezdefiniowany". – gilly3

+1

Uważam, że brakuje nawiasów na końcu deklaracji THING, czyli. RZECZ = funkcja {}(); –

Odpowiedz

1

Tak, są równoważne. I nie znam żadnej wersji JavaScript, w której nie były (jednak wydaje się, że call zostało dodane w 1.3).

+1

Dlaczego upadek? – Bergi

+0

W końcu zdałem sobie sprawę, że mogę przetestować prawdziwość mojej hipotezy za pomocą Firebug. Masz rację. A ponieważ pierwszy odpowiedziałeś, dam ci zwycięstwo. Twoje zdrowie. – theJollySin

0

Są takie same technicznie. Ale zachowują się też nieco inaczej w programowaniu asynchronicznym. Metoda call() służy do wywoływania funkcji, przekazując zakres jako parametr. Zapewnia to wygodny sposób wywoływania zdefiniowanych funkcji w wywołaniach zwrotnych i opóźnionym wykonywaniu (setTimeout, setInterval). Jeśli korzystałeś z którejkolwiek z bibliotek JS, zauważyłeś $ .proxy lub _.bind, są to aliasy implementujące wywołanie (scope);

Aby uzyskać więcej informacji, patrz this MDN doc.

+2

Dlaczego spadamy? Czy możesz wskazać, co było nieprawidłowe w tym, co powiedziałem? Chciałbym się poprawić, gdybym przynajmniej zrozumiał coś złego. – praneetloke

+1

Nie spadłem, ale 'call' nie ustawił zakresu. – nnnnnn

+0

Czy przeczytałeś dokument MDN w mojej odpowiedzi? Pierwszy argument w wywołaniu() to "thisArg", który można ustawić na dowolny obiekt reprezentujący zasięg (kontekst). – praneetloke