Po pierwsze, kilka rzeczy:
Innym sposobem patrzenia na JavaScript jest 1 milion i 1 rzeczy, które możesz zrobić z funkcją jako konstrukcją. Wszystko tam jest, jeśli jej szukasz. Po prostu nigdy nie jest daleko od funkcji.
Ta kwestia tworzenia wtyczek jQuery jest okropna. Nie mam pojęcia, dlaczego oni to popierają. Rozszerzenia $ powinny być rzeczami ogólnego użytku, które $ już ma całkiem dobrze pokryte, a nie metodami budowania mnie jako kompletnego widgetu. To narzędzie normalizacyjne DOM-API. Jego użycie najlepiej jest zakopać wewnątrz własnych obiektów. Nie widzę potrzeby używania go jako pełnego repozytorium biblioteki interfejsu użytkownika.
Pakiety w sieci po stronie klienta są bezcelowe
To, czego osobiście nie lubię w pakietach po stronie klienta, to to, że udajemy, że robimy coś, czym tak naprawdę nie jesteśmy. W post-webformach internetowych i gobach przerażających rzeczy, których nigdy nie wymanewrowałeś z naszych przyjaciół Java, wolałbym myśleć o kawałku HTML z połączonymi zasobami jako tym, czym naprawdę jest i nie próbujcie uspokoić programistów aplikacji odpornych na naukę nowych systemów operacyjnych, udając, że to coś innego. W JS w sieci po stronie klienta nic nie zostaje „zaimportowane”, z wyjątkiem robienia czegoś okropnego z Ajaxem, który działa w nieświadomości buforowania przeglądarki, co tak wielu próbowało zrobić. Dla przeglądarki liczy się tylko to, że została ona załadowana i zinterpretowana lub nie. Nie mamy więcej kodu ukrytego na kliencie dostępnym do użycia „na wszelki wypadek” z dobrych powodów. # 1 to, że właśnie opisałem zależności wtyczek i przeglądarek dla aplikacji internetowych, ponieważ zjawisko to na ogół nie działało zbyt dobrze. Chcemy teraz sieci. Nie po tym, jak Adobe lub Sun dokonają aktualizacji po raz trzeci w tym tygodniu.
Język ma to, czego potrzebuje do struktury
Obiekty JS są wysoce zmienne. Możemy mieć rozgałęzione drzewa przestrzeni nazw w każdym stopniu, w którym uznamy to za przydatne i jest to bardzo łatwe. Ale tak, w przypadku wszystkiego, co można ponownie wykorzystać, musisz przykleić katalog główny dowolnej biblioteki do globalnej przestrzeni. W każdym razie wszystkie zależności są powiązane i ładowane jednocześnie, więc po co robić cokolwiek innego? Celem unikania globalnej przestrzeni nazw nie jest to, że wszystko jest złe. Jest zbyt wiele rzeczy, które są złe, ponieważ ryzykujesz kolizją przestrzeni nazw lub przypadkowym zastąpieniem podstawowych funkcji języka.
To, że jest popularny, nie oznacza, że robimy to dobrze
Teraz, gdy zobaczysz to w aplikacji internetowej po stronie klienta:
(function(){
//lots of functions defined and fired and statement code here
})()
Problemem nie jest to, że brakuje nam narzędzi do strukturyzacji aplikacji, problem polega na tym, że ludzie nie cenią struktury. W przypadku 2-3 stron jednorazowych tymczasowych stron internetowych z agencji projektowej naprawdę nie mam z tym problemu. Kiedy robi się brzydko, musisz zbudować coś łatwego w utrzymaniu, czytelnym i łatwym do modyfikacji.
Ale kiedy dotrzesz do miejsca, w którym nadszedł czas, aby po prostu zaimplementować wszystkie przedmioty wielokrotnego użytku i fabryki, a może jeden lub dwa nowe tymczasowe pojazdy mogą wkraść się w ten proces, to wygoda.
Ale są implementacje JS z pakietami / modułami
Należy pamiętać, że w Node.js, gdzie takie rzeczy mają o wiele większy sens, mają moduły. JS, zakładając, że możemy uniknąć uber-config-hell, który plagi innych języków, jest jedyną rzeczą w równaniu, a każdy wykonywany plik ma swój własny izolowany zakres. Ale na stronie internetowej samo połączenie pliku js jest instrukcją importu. Wykonanie większego importu w locie to tylko strata czasu i zasobów, ponieważ uzyskanie zasobów wymaga dużo więcej wysiłku niż zwykłe dodawanie linków do plików, ponieważ potrzebujesz ich, wiedząc, że zostaną one zapisane w pamięci podręcznej w przeglądarce, jeśli kolejna strona będzie ich ponownie potrzebować. Próbuje więc podzielić przestrzeń globalną, robiąc cokolwiek innego niż tworzenie fabryk obiektów adapterów, takich jak jQuery lub bardziej tradycyjne obiekty, które obejmują duży podzbiór zadań w danej domenie, zajmując jedno miejsce w globalnym. Tam'http://wiki.ecmascript.org/doku.php?id=harmony:modules
Więc nie, nie ma nic złego w automatycznych wywoływaczach używanych do unikania globalnego zanieczyszczenia przestrzeni nazw, gdy istnieje dobry powód, aby używać takich rzeczy (częściej niż nie ma). I mamy trwałe właściwości ekwiwalentu prywatnego w naszych obiektach (wystarczy zdefiniować zmienną w konstruktorze i nie ujawniać jej jako właściwości).
Jednak fakt, że MOŻEMY robić takie rzeczy, jest niesamowity. Częste użycie jest oznaką, że programiści JS wciąż mogą dojrzewać, ale nie jest to luka w języku dla każdego, kto nie próbuje narzucić paradygmatu na stronę po stronie klienta, co po prostu nie ma sensu.