Striktně řečeno (use-strict)

AndreaAndrea

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.