2011-08-24 17 views
9

Zdaję sobie sprawę, że jest to przydatne (ze względu na wydajność), aby zrobić coś takiego ...Jaki jest sens ponownego przypisywania zmiennych argumentów?

function Abc(a, b, c) { 
    var window = window; 

Więc gdy kod dostępu window, nie trzeba iść w górę łańcucha zakres, by w końcu znaleźć window. To samo można zrobić dla document, navigator, itp ...

Ale jestem w trakcie przepisywania niektórych MobiScroll jQuery plugin i znalazłem to ...

function Scroller(elm, dw, settings) { 
    ... 
    var elm = elm; 
    var dw = dw; 
    ... 

Jakie są zalety ponownym zainicjowaniem elm i dw wskazywać ich zmienne argumentu?

Czytałem dużo o uzyskiwaniu dostępu do arguments za kosztowne, ale nigdy nie czytaj nic o tym, dlaczego to może być dobra praktyka.

Jakie są tego korzyści?

W przeszłości posiadałem deliberately removed ten koncept z dokumentacji MDN.

+0

Nigdy tego nie widziałem. Pozwól silnikowi martwić się o "optymalizacje". –

+0

@pst Zgadzam się. Jednak mam ciekawy umysł ... – alex

+1

To jest mniej więcej duplikat [JavaScript - Czy muszę używać "var" przy zmianie przypisania zmiennej zdefiniowanej w parametrach funkcji?] (Http://stackoverflow.com/questions/2495174/javascript-do-i-eded -to-use-var-when-ponowne przydzielanie-a-zmiennej-zdefiniowanej-w-fu). Jednak nie wiem, czy są to odpowiedzi, których potrzebujesz. –

Odpowiedz

2
> function Abc(a, b, c) { 
>  var window = window; 

Więc gdy kod dostępu okno, to nie musi iść w górę łańcucha zakres by w końcu znaleźć okno.

Nie sądzę, że to jest powód. W przypadku funkcji zadeklarowanej w zasięgu globalnym, rozpoznawanie lokalnie i globalnie identyfikatora będzie nieznacznie szybsze (i być może wolniejsze w zależności od przeglądarki).

skrypty można użyć mniej podobny do powyższego, w celu zapewnienia okno odnosi się do oczekiwanej okno przedmiotu a nie inne okno w łańcuchu zakresu, np

var fn = (function(window) { 

    // In here window is unequivocally a reference to the global object 

}(this)); 

W drugim przykładzie:

> function Scroller(elm, dw, settings) { 
>  ... 
>  var elm = elm; 
>  var dw = dw; 
>  ... 

Deklarowanie zmiennych jest kompletna strata czasu. Umieszczenie identyfikatora na formalnej liście parametrów deklaracji funkcji lub wyrażenia jest równoznaczne z deklarowaniem lokalizacji za pomocą var. Deklarowanie takich identyfikatorów jako zmiennych lokalnych nie ma żadnego wpływu.

Była wczesna wersja Safari, która miała problem z parametrami formalnymi, które nie zostały przekazane wartości, ale to było dawno temu i był tylko problem w jednym bardzo konkretnym przypadku.

+0

+1 dzięki RobG, to jest świetna odpowiedź. – alex

+2

Odnośnie pierwszej części odpowiedzi: Tak, w przypadku funkcji globalnych nie będzie dużej różnicy. Ale często funkcje są zagnieżdżane w innych funkcjach, używanych jako wywołania zwrotne itp. I tam jest sens, aby jakikolwiek obiekt był jak najbliżej. Zależy to również od tego, * jak często * dany obiekt jest dostępny. Zasada jest taka, że ​​jeśli uzyskujesz dostęp do właściwości lub obiektu więcej niż jeden raz, przechowuj go w zmiennej lokalnej. –

+0

@Felix King W ogóle nie używam tej zasady - moja zasada brzmi: "... jeśli sprawi, że kod stanie się bardziej czytelny/łatwiejszy do utrzymania niż ...", który * nie ma nic wspólnego z "wydajnością" "lub" count ". –

0

Jedyny logiczny powód jest potencjalnie wyjaśnienie jaki zakres zmienna została zadeklarowana w.

Inne następnie, że po prostu dodaje nadmiar kodu.