Striktní mód je způsob, jak změnit zpracovávání samotného JavaScriptového kódu. Pokud chceme, aby se kód zpracovával přísněji a tím nám pomáhal předejít zbytečných chybám a nejednoznačnému chování. V řadě případů, je totiž lepší dostat chybovou hlášku, než předpokládat, že takhle napsaná konstrukce byl záměr.
V roce 2009 byl s vydáním verze ES5, původní režim (ne-striktní) se pak označuje jako sloppy
mód.
Je to volitelný režim, který lze aktivovat, přidáním následující direktivy (pragma) buď na začátek celého programu, souboru nebo funkce.
"use strict";
Pokud používáte transpiler kódu jako Babel, pak tyto nástroje obvykle zapínají striktní mód. Pokud váš kód funguje v tomto režimu, bude fungovat i v nestriktním. V článku si dále rozebereme na jaké konstrukce má dopad a co se mění.
Vynucuje lepší syntaxi
Tento přísný režim ovlivňuje především ošetřování chyb (během parsování/kompilování nebo provádění). Což by nás mělo donutit psát kód s vyšší kvalitou.
Nelze používat rezervovaná slova jako identifikátor
Například, let
je rezervované slovo a nestriktním režimu tak můžete použít let
jako název proměnné:
var let = 10; // V non-strict mode je to povoleno
console.log(let); // Vypíše 10
Pokud zapnete strict mode, toto se stane chybou:
"use strict";
var let = 42; // Chyba: Unexpected strict mode reserved word
console.log(let);
Asi se shodneme, že takhle pojmenovávat proměnné opravdu není ideální. Existují pravidla jakými se můžete řídit, abyste proměnnou vhodně pojmenovali. Parsery a syntax highligtery nemají rádi, když se indetifikátory a klíčové slova míchají.
Další rezervována slova jsou implements
, interface
, package
, private
, protected
, public
, static
a yield
jsou v strict mode zakázána, protože můžou být v budoucnu používaná v jazyce.
Zabrání duplicitním parametrům ve funkcích
Bez strict mode, můžete mít funkci s duplicitními parametry. To je ale matoucí a může vést k chybám, takže je to zakázáno.
Zabrání náhodnému vytváření globálních proměnných
Pokud jste zapomněli na deklaraci proměnné (slovem var
, let
nebo const
), v nestriktním režimu se automaticky vytvořila globální proměnná a vy si tak nemusíte všimnout chyby.
Striktní mód však tohle nepovoluje a v místě přiřazení proměnné, které není deklarovaná vyhodí chybu ReferenceError
.
Tato chyba naznačuje, že jste buď zapomněli deklarovat proměnnou nebo jste udělali překlep v jejím názvu.
function nonStrict() {
a = 2;
return a*a;
}
Dělá this
undefined
Různé mody mají vliv na chování this
. V ne striktním módu this
odkazuje na globální objekt (v prohlížeči je to window). V strict mode, this
je undefined, pokud ho nepoužijete ve funkci jako konstruktoru nebo pokud ho nevyvoláte metodou objektu.
Nemůžeme přiřadit hodnoty readonly proměnným
Pokusu o přiřazení do proměnné, nebo vlastnosti která je pouze pro čtení dostaneme chybu, místo by toto chování JS v tichosti ignoroval a mi byly překvapeni, že dostáváme původní hodnotu.