2009-10-27 23 views
6

Biorąc ramy jQuery na przykład, jeśli uruchomić kod tak:Czy nazwane funkcje są niedoceniane w JavaScript?

$(document).ready(function init() { foo.bar(); }); 

Ślad stosu można uzyskać w Firebug będzie wyglądać następująco:

init() 
anonymous() 
anonymous([function(), init(), function(), 4 more...], function(), Object name=args) 
anonymous() 
anonymous() 

Jak widać, nie jest to bardzo czytelny, ponieważ musisz kliknąć każdą funkcję, aby dowiedzieć się, co to jest. Anonimowe funkcje pojawią się również jako (?)() w programie profilującym i mogą prowadzić do błędu "cannot access optimized closure". Wydaje mi się, że są to dobre powody, aby ich unikać. Jest też fakt, że ECMAScript 5 wycofa się z arguments.callee w trybie ścisłym, co oznacza, że ​​nie będzie można odwoływać się do anonimowych funkcji, czyniąc je nieco mniej odpornymi na przyszłość.

Z drugiej strony, za pomocą nazwanych funkcji może prowadzić do powtórzenia, np:

var Foo = { 
    bar: function bar() {} 
} 

function Foo() {} 

Foo.prototype.bar = function bar() {} 

Czy mam rację sądząc, że powtarzanie jest uzasadnione w świetle wygody debugowania nazwane funkcje świadczenia, a częstość występowania anonimowych funkcji w dobrych frameworkach takich jak jQuery to niedopatrzenie?

Odpowiedz

3

Znalazłem odpowiedź na moje pytanie w tym very informative article. Po pierwsze okazało się, że miałem rację, że nazwane funkcje są bardziej pożądane, ale rozwiązanie nie jest tak proste jak dodawanie identyfikatorów do wszystkich anonimowych funkcji. Główną tego przyczyną są wyrażenia funkcji wykonawczych JScript w bardzo zepsutej formie.

Po drugie, istnieje rozróżnienie między instrukcjami funkcyjnymi a wyrażeniami. Anonimowa funkcja jest po prostu wyrażeniem funkcji z pominiętym identyfikatorem, a dodanie identyfikatora (nazywanie go) nie sprawiłoby, że byłoby to stwierdzenie (z wyjątkiem JScript, dlatego jest zepsute). Oznacza to, że wszystkie pozostałe odpowiedzi były nie na miejscu.

+2

Niestety link do tego artykułu nie działa. Jednak ten sam artykuł można znaleźć tutaj: http://kangax.github.com/nfe/ – Jan

1

Ale dla mnie anonimowe funkcje są bardziej czytelne w kodzie źródłowym, ponieważ jestem pewien, że są tam tylko używane.

3

Zgadzam się, że istnieją pewne wady stosowania anonimowych metod w JavaScript/EMCAScript. Nie należy jednak lekceważyć, w jaki sposób należy ich używać. W przypadku prostych wkładek, które chcesz przekazać innej funkcji, często są doskonałe.

+1

To nie jest tak, że używanie nazwanych funkcji ma dodawać więcej linii, chyba że używasz naprawdę długich nazw i mają zawijanie wyrazów. – slikts

+1

Nie musi, nie, ale czasami jest to bardzo wygodne. Czasami funkcja naprawdę NIE POTRZEBUJE nazwy. Po co to dawać? –

0

Anonimowe funkcje są bardzo wygodne. Lepszą odpowiedzią na ten problem, zamiast nazywania funkcji, byłby komunikat firebug, w którym wierszu pliku utworzono anonimową funkcję.

init() 
anonymous() // application.js, line 54 
anonymous() // foo.js, line 2 

A ślad stosu jest jedynym miejscem, w którym funkcje anonimowe są problematyczne.

+0

Wymieniłem trzy inne problemy z anonimowymi funkcjami, a Firebug raportuje numery linii dla nich. – slikts

+0

Zwróć uwagę na "imo". –

Powiązane problemy