W 2009 roku wraz z wydaniem ES5, JS dodał tryb ścisły jako mechanizm opt-in do zachęcania programistów do pisania lepszych programów JS.
Korzyści z trybu ścisłego znacznie przewyższają koszty, ale stare nawyki umierają ciężko, a "naprawa" istniejących („legacy) baz kodu jest naprawdę trudna. Niestety, ponad 10 lat później, opcjonalność trybu ścisłego oznacza, że nadal niekoniecznie jest on domyślny dla programistów JS.
Dlaczego tryb ścisły? Tryb ścisły nie powinien być traktowany jako ograniczenie tego, czego nie możesz zrobić, ale raczej jako przewodnik po najlepszym sposobie robienia rzeczy, aby silnik JS miał najlepszą szansę na optymalizację i wydajne działanie kodu.
Większość elementów sterujących w trybie ścisłym ma postać wczesnych błędów, co oznacza błędy, które nie są błędami ściśle składniowymi, ale wciąż są zgłaszane w czasie kompilacji (przed uruchomieniem kodu). Na przykład tryb ścisły uniemożliwia nazywanie dwóch parametrów funkcji tak samo i powoduje błąd. Niektóre inne kontrolki trybu ścisłego są obserwowalne tylko w czasie wykonywania, na przykład domyślna wartość słowa "this" jako niezdefiniowana (undefinded).
Zamiast walczyć i kłócić się w trybie ścisłym, jak dziecko, które chce po prostu przeciwstawić się temu, co mówią im rodzice, najlepszym sposobem myślenia o trybie "ścisłym" jest to, że jest on jak liniowiec przypominający, jak JS powinien być napisany, aby mieć najwyższą jakość oraz najlepszą szansę na wydajność. Jeśli czujesz się zakuty w kajdanki, próbując obejść tryb ścisły, powinna to być czerwona flaga ostrzegawcza, którą sygnalizuje, że musisz przemyśleć całe podejście.
Tryb ścisły jest włączony dla każdego programu (dla pliku!) W następujący sposób:
// only whitespace and comments are allowed
// before the use-strict pragma
"use strict";
// everything in this file runs in strict
// mode
W górnej części pliku musi pojawić się pragma trybu ścisłego, z dozwolonymi tylko białymi spacjami lub komentarzami.
Niewielką sprawą, o której trzeba pamiętać, jest, że nawet zabłąkany ";" uczyni pragmię bezużyteczną; nie są zgłaszane żadne błędy, ponieważ poprawne JS ma wyrażenie dosłowne w pozycji instrukcji, ale po cichu nie włączy trybu ścisłego!
Tryb ścisły można alternatywnie włączyć w zależności od zakresu (scope) funkcji, z dokładnie tymi samymi regułami / upomnieniami dotyczącymi jego pozycjonowania):
function someOperations() {
// whitespace and comments are fine here
"use strict";
// all this code will run in strict mode
}
Co ciekawe, jeśli cały plik ma włączony tryb ścisły, trybu ścisły na poziomie funkcji jest niedozwolony. Więc musisz wybrać jedno lub drugie.
Jedynym uzasadnionym powodem zastosowania podejścia do trybu ścisłego dla poszczególnych funkcji jest konwertowanie istniejącego programu i konieczne jest stopniowe wprowadzanie zmian w miarę upływu czasu. W przeciwnym razie znacznie lepiej jest po prostu włączyć tryb ścisły dla całego pliku / programu.
Wielu zastanawia się, czy JS kiedykolwiek nada trybowi domyślnemu tryb ścisły? Odpowiedź brzmi: prawie na pewno nie. Jak już wcześniej mówilIstnieje jednak kilka czynników, które zmniejszają przyszły wpływ tego niewystarczającego „zaciemnienia” trybu ścisłego.iśmy o kompatybilności wstecznej, jeśli aktualizacja języka JS oznaczyła by, że każdy kod jest trybem ścisłym, wtedy wszystkie kody "legacy" nie przechodziły by nowej walidacji silnika JS.
Warto zaznaczyć, że praktycznie cały transpilowany kod kończy się w "trybie ścisłym", nawet jeśli oryginalny kod źródłowy nie jest zapisany jako taki. Większość produkowanych kodów JS została przetranspilowana, co oznacza, że większość kodu JS na www, już przestrzega trybu ścisłego.
Co więcej, zachodzi szeroka zmiana w kierunku pisania nowego kodu JS przy użyciu formatu ES6. Moduły ES6 przyjmują tryb ścisły, więc cały kod w takich plikach jest automatycznie domyślnie ustawiany na ten tryb.
Tryb ścisły jest w dużej mierze de facto domyślny, chociaż technicznie tak naprawdę nie jest domyślny.