2015-12-16 15 views
8

Czy powinienem używać "ścisłego" dla każdej funkcji javascript, którą piszę?Czy powinienem używać "ścisłego" dla każdej funkcji javascript, którą piszę?

Co to jest dobra praktyka, aby używać ścisłego w dużym projekcie AngularJS? Używanie go na całym świecie może spowodować uszkodzenie biblioteki stron trzecich, która go nie obsługuje, ale robienie "użycia ścisłego" za każdym razem jest po prostu dużą ilością powtórzeń.

+2

Krótka odpowiedź, tak! –

Odpowiedz

8

W tym pytaniu należy wystrzegać się ogólnej tendencji do upraszczania.

Po pierwsze, cały kod absolutnie powinien być być uruchomiony w trybie ścisłym. Współczynnik nowoczesnej funkcjonalności javascript został zmieniony (patrz .call() and apply()) lub zniekształcony (silent Errors) przez wykonanie kodu poza trybem ścisłym. (Więcej informacji na ten temat: here, od firmy Crockford.)

Jednak w przypadku adresu należy sprawdzić, czy kod działa w trybie ścisłym. Istnieją co najmniej dwa konteksty do rozważenia:

W przeglądarce Twój kod powinien zostać dostarczony po minifikacji. Jeśli umieścisz 'use strict' w każdym ciele funkcji, twój minifier nie rozłączy go, a zmarnujesz bajty, powtarzając je wszędzie. Potrzebujesz go tylko w swoim najbardziej zewnętrznym zakresie funkcji — u góry definicji modułów. Jednym ze sposobów jest owinąć minified kod w jednym zamknięciem Iife jako część procesu produkcji:

;(function(){ 
    'use strict' 
    // All code here. 
}()) 

To, jak sądzę, jest zbliżony do idealnego sposobu prowadzenia, ale to bardziej lub mniej mówi, że jesteś przyjąć ciągły proces integracji (ponieważ, aby obserwować twój kod działający w trybie ścisłym, musisz mieć wszystko zapakowane jedno zamknięcie). Jeśli nie pracujesz w ten sposób, musisz zawrzeć dyrektywę use strict u góry każdej funkcji, która nie jest zadeklarowana w zasięgu innej funkcji.

Na serwerze, jest to znacznie prostsze, oczywiście. Kod nie jest zminimalizowany, a bajty nie mają znaczenia, więc możesz dołączyć dyrektywę use strict u góry każdego pliku.

Słowo ostrzeżenia na --use_strict: W przypadkach, gdzie można kontrolować w jaki sposób prowadzone są skrypty, może znaleźć się pokusie, aby użyć flagi --use_strict wykonania. Jest to łatwe, ale oznacza to, że wszystkie zależności muszą być zgodne z wymaganiami ścisłymi. Ponieważ nie możesz kontrolować przestrzegania zasad przez każdą firmę zewnętrzną, zwykle jest to nierozsądne.

+0

jest; before (function(), co jest purporse; tam? –

+4

Załóżmy, że twój plik js miał zostać dołączony do innego pliku o nazwie returnFunc.js, który zwraca funkcję, a następnie masz wartość funkcji, po której następuje '(funkcja() ...) ", co oznacza, że ​​twój plik zostanie zinterpretowany jako wejście do funkcji zwróconej przez returnFunc.js, a funkcja zostanie wywołana. Nic nie będzie działać zgodnie z oczekiwaniami w tej sytuacji, a debugowanie będzie dość mylące Przedrostek średnika eliminuje tę możliwość –

+0

Myślę, że minifier powinien wiedzieć, aby usunąć duplikaty 'use strict's, jeśli jest najbardziej zewnętrzny' use strict '. –

9

Cały kod piszesz should być w strict mode. To helps you catch mistakes, nie ignorując wyjątków.

Jednak nr, to nie znaczy, że trzeba poprzedzić "use strict"; każdej function definicji, tylko należy umieścić go w zakresie modułu - raz na pliku - tak, że jest dziedziczone przez wszystkie funkcje. Kiedy i tak zamierzasz przełączyć na moduły ES6: it will be implied.

1: Chciałbym nawet argumentować za włączeniem go globalnie, ponieważ tryb ścisły nie powinien łamać poprawnie napisanego kodu.
Jeśli robi złamać skryptu przez osoby trzecie, rozwiązanie nie może być ponownie, aby wyłączyć tryb ścisły ...

+1

@RobG: Zrobione :-) – Bergi

+0

@DouglasDaseeco Myślę, że drugi akapit mojego wpisu odpowiada na to pytanie. Pierwszy po prostu ustanawia fakt. Może "* Tak *" jest mylące, czy powinienem je edytować? – Bergi

+0

@DouglasDaseeco Edytowane. I wyrzuciłem ten link. Nie mam pojęcia, dlaczego tak się przydało w 2015 roku. – Bergi

6

Krótka odpowiedź, tak! Nie musisz uwzględniać go dla każdej funkcji, ale możesz po prostu dodać go raz na plik JavaScript. Po uruchomieniu pliku należy rozpocząć od zamknięcia następującego:

(function() { 
    "use strict"; 
    // Rest of your code. 

})(); 
+2

Dlaczego? Możesz po prostu umieścić go na górze pliku bez opakowania funkcji samo-wywołania. – bjb568

+1

@ bjb568 Które dotyczyłoby wszystkich funkcji, prawda? –

+2

Tak, a także zakres zewnętrzny. – bjb568

2

Nie Redundancja nie jest konieczna. Zaleca się użycie deklaracji w zakresie plików lub strumienia, szczególnie jeśli używane są biblioteki stron trzecich. Pomaga zdecydować, czy używać ich tak jak jest, owijać je lub przekazywać za ich pomocą.

poziomie plików na własny wykonujące funkcje

To staje się coraz bardziej powszechne, aby zobaczyć pliki lub całe strumienie na własny wykonywania zamknięć. W takich przypadkach deklaracja użycia trybu ścisłego (powyżej) jest umieszczana w pierwszym wierszu zamknięcia, gdzie ... jest.

(function() { 
    ... 
}()) 

Może to być przydatne wspomnieć, że samo-realizacji nie zawsze jest konieczne i może spowodować powolny obciążenia i inne problemy, jeśli nadużywane.

Więcej na Zakresie Deklaracji

Zakres zależy od tego, czy umieścić deklarację wewnątrz lub na zewnątrz funkcji i ma zastosowanie do wszystkich oświadczeń następujących deklaracji w zakresie zamknięcia za.

Użycie deklaracji wewnątrz funkcji jest niewłaściwym sposobem wykonania tego zadania, jeśli cały plik lub strumień jest już zgodny z bardziej rygorystycznym trybem lub można go łatwo wprowadzić. Nadmiarowość nie jest konieczna, dlatego zalecanym zastosowaniem jest umieszczenie deklaracji na górze pliku lub początku strumienia.

Czasami tylko niektóre funkcje są zgodne z bardziej rygorystycznymi zasadami. W takich przypadkach mniej pożądany zakres funkcji deklaracji może być użyty w celu popienienia lepszych praktyk kodowania przynajmniej w funkcjach, które już spełniają.

Dlaczego tryb ścisły w ogóle?

Tryb ścisły eliminuje pewne permisywne parsowanie języka i cechy wykonania uważane za mniej pożądane z punktu widzenia projektowania języka. Te nieostre cechy języka trybu zostały uznane za ostrożne jako zachowanie domyślne dla zgodności wstecznej. Streszczenie i szczegóły znajdują się tutaj.

To nie jest jednoznacznie określone, kiedy i czy te starsze cechy językowe od początku Netscape dni będzie przestarzała czy tryb ścisły staną się domyślne zachowanie w różnych przeglądarkach w pewnym momencie , ale bardziej restrykcyjny model prawdopodobnie będzie źródłem mniej dwuznacznego i ryzykownego źródła. Jeśli chcesz poprawić łatwość obsługi, przenośność i rozszerzalność w praktyce kodowania i bazach kodów, dobrym wyborem jest tryb ścisły.


UWAGA Dla tych, którzy przyjeżdżają tu z "What's the benefit of using "function() 'use strict'” in every file?"

można umieścić

"use strict"; 

na górze sekwencji kodu lub wewnątrz funkcji, więc jest tylko jedna linia kodu za plik lub za funkcję.

Pozostałe wiersze kodu mają inne cele w kodzie here.

  • funkcja Self-Wywoływanie
  • Fabryka inwokacja

Niektóre miejsce cały plik w samodzielnym wykonywaniu funkcji, ale to nie jest konieczne w każdym przypadku.

Powiązane problemy