2013-02-12 12 views
6

Niedawno przeczytałem kilka artykułów dotyczących wydajności jQuery i wymyśliłem kilka dziwnych pytań.

  • Czy/powinienem buforować $(window)?

    Jeśli tak, to czy wpłynie to na resize, scroll, width, scrollTop ... itd?

  • Czy/powinienem buforować $(document)?

    Ponieważ używamy wielu akcji myszy, powinienem zrobić var doc = $(document);?

  • Czy mogę zawsze cache $(this) w dużym bloku kodu?

    Jeśli chodzi o var self = $(this);, w jakim stanie self może się różnić od $(this)?

+0

Możesz buforować '$ (okno)' ale czy zrobiłeś profil, aby sprawdzić, czy to było przydatne dla twojej aplikacji? –

+0

użycie 'var self = $ (this)' jest użyteczne, gdy '$ (this)' może zmienić się w zależności od zakresu i potrzebujesz odwołania do oryginalnego '$ (this)' – xdumaine

+0

Nie nazywaj tego buforowaniem, ponieważ to nie jest. Po prostu zapisujesz coś w zmiennej. Najbliższą rzeczą, jaką można uzyskać, to "$ .cache" – Johan

Odpowiedz

9

wszystkie trzy pytania: tak można!

Neccessery: nie

Lepsza wydajność: może

Można spróbować i zrobić punkt odniesienia. Ale powodem buforowania nie jest przeszukiwanie całego DOM dla selektora. Wyszukiwanie dokumentu i okna nie stanowi problemu, ponieważ są to 2 zmienne główne. Buforowanie $ (this) zależy od sytuacji. Zobacz moją drugą wskazówkę.

Zawsze buforować obiektu nadrzędnego uruchomieniu zapytania na temat:

var header = $('#header'); 

var menu = header.find('.menu'); 
// or 
var menu = $('.menu', header); 

Lepiej łańcuchu metody jQuery niż buforować selektorów:

$('li.menu-item').click(function() {alert('test click');}) 
        .css('display', 'block') 
        .css('color', 'red') 
        fadeTo(2, 0.7); 

elementy Cache że często:

var header = $('#header'); 
var divs = header.find('div'); 
var forms = header.find('form'); 

Wolna dodatkowa wskazówka wydajność:

Selektory fastes do najwolniejszego:

Id > Tag > classes 
+3

To właśnie czytałem w tych dniach. Czy możesz skupić się na 3 zadawanych pytaniach? – user1643156

+0

Po pierwsze 2 pytania, nie. Możesz spróbować zrobić benchmark. Ale powodem buforowania nie jest przeszukiwanie całego DOM dla selektora. Wyszukiwanie dokumentu i okna nie stanowi problemu, ponieważ są to 2 zmienne główne. Buforowanie $ (this) zależy od sytuacji. Zobacz moją drugą wskazówkę. Zaktualizowana odpowiedź. – Timmetje

2
  1. Tak, można buforować $ (okno), a to nie pomaga na wydajność.
    Ktoś już wykonał test w jsperf. http://jsperf.com/jquery-window-cache

    Wynik badania jest rodzaj zawiedli, ale nadal można „Test Run” na przeglądarce, aby zobaczyć różnicę.

  2. Tak, można również buforować dokument $ (dokument). Nie używam $ (dokument) dużo, , ale bazuję na teście, który zrobiłem w jsperf (http://jsperf.com/document-vs-cache), buforowanie $ (dokument) nie pomogę również przy wydajności .

  3. I tak, możesz przechowywać w pamięci podręcznej $ (this). Ale ten jest inny niż inne inne. Jak już wiesz, wartość $ (this) zmieni się zależą od innej sytuacji. Na przykład, jeśli używasz $ (this) u myszy słuchacza tak ....

    $(".button").on("click",function(){ 
        var $this = $(this); 
    }); 
    

    $ (this) ulegnie zmianie, gdy użytkownik kliknij na przycisk z "przycisku" klasa i $ ("this") stanie się obiektem, który został kliknięty przez użytkownika .

    Buforowanie $ (this) może pomóc w wydajności, jeśli użyjesz $ (this) lot wewnątrz funkcji. Ale pamiętaj, że jeśli buforujesz $ (this) wewnątrz funkcji, bufor będzie zmienną lokalną zamiast globalną, i zostanie zniszczony na końcu funkcji. Więc nie będziesz w stanie użyć go poza funkcją.

0

Rzeczywiste pytanie brzmi Can I cache $(window) and $(document) in jQuery?

Jeśli chcesz buforować okno lub dokument dla dalszego wykorzystania w tej samej sesji, tak można.

Wszystkie utworzone zmienne/funkcje zostaną usunięte, jeśli użytkownik zamknie okno/sesję.

Powiązane problemy