2013-03-08 6 views
5

Jaki jest najczęstszy sposób na zachowanie kontekstu this? Co jest szybsze? Co wolisz?

  1. $ .proxy (...)

    $('a').on('click', $.proxy(function() { 
        this.close(); 
    }, this)); 
    
  2. var własnym

    var self = this; 
    
    $('a').on('click', function() { 
        self.close(); 
    }); 
    
+0

Preferuję '$ .proxy()' –

+0

Moja osobista statystyka utrzymuje się na poziomie około pięćdziesięciu pięćdziesięciu. Z całą powagą: wybierz jedną i trzymaj się jej. FYI, '$ .proxy' jest tym samym, co natywna metoda" .indeksowania "funkcji. –

+0

Szybciej jak? Jeśli chodzi o wykonanie, musisz go [porównać] (http://jsperf.com). Co wolałbym? Poszedłbym z drugą opcją, ponieważ jest dla mnie po prostu bardziej czytelna. –

Odpowiedz

2

Zacznijmy od ustalenia kodu. Masz niepotrzebny deklaracja funkcji, można użyć $.proxy jak

$('a').on('click', $.proxy(this.close, this)); 

Teraz drugiego rozwiązania opartego na self

  • wymaga jedynie podstawowej wiedzy javascript
  • nie wymaga jQuery
  • jest trochę bardziej czytelny, zwłaszcza że często używasz ponownie swojej zmiennej self zmienna
  • jest znacznie szybsza

To pewnie dlatego jest bardziej używany.

Należy pamiętać, że jeśli nie muszą być zgodne z IE8, można użyć bind:

$('a').on('click', this.close.bind(this)); 
0

Wybierz pierwszy. nie wymaga dodatkowej zmiennej.

1

Obie są wspólne.

Prędkość w tym przypadku nie ma znaczenia. Użytkownik nie zauważy, czy wywołanie zwrotne dla kliknięcia rozpoczyna się po 0,01 ms. lub 0,1 ms.

W rzadkich przypadkach, w których ma to znaczenie, oczekuję, że metoda zmiennej będzie nieco szybsza, ale trzeba by ją porównać.

Moje osobiste preferencje różnią się w zależności od tego, gdzie są używane i od tego, jaki jest kod wewnątrz wywołania zwrotnego. Jedną z zalet metody zmiennej jest to, że działa ona dla zagnieżdżonych wywołań zwrotnych bez konieczności ponownego jej stosowania na każdym poziomie.

+2

Istnieje jeszcze jeden powód wyboru bardziej wydajnego sposobu niż tylko czas reakcji: jeśli akcje zaczynają się od 0,1 ms 0,01 ms po kliknięciu, co oznacza, że ​​ma 0.Jeszcze o 09 ms wykonanie JS, które na smartfonie powoduje bezpośrednio więcej utraty baterii dla tego samego działania. Oczywiście, że to praktycznie nic, ale gromadzi się szybko. Ponadto, dla porównania: od 0,1 do 0,01 nadal jest to 1000% poprawa;). – Simon

+0

@Simon: Jesteś mikro optymalizacją. Jeśli chcesz zoptymalizować, na pewno w kodzie są inne rzeczy, w których możesz zaoszczędzić znacznie więcej czasu na wykonanie. – Guffa

+2

To prawda, ale chodzi o zasadę wyboru bardziej wydajnego sposobu w ogóle, a nie o faktyczne oszczędzanie czasu, które można uzyskać w tym przykładzie. – Simon

Powiązane problemy