"use strict";
Definuje to JavaScript kód by měl být spuštěn v „přísný režim“.
Direktiva "use strict"
byla v ECMAScriptu verze 5 nová.
Není to prohlášení, ale doslovný výraz, ignorovaný dřívějšími verzemi JavaScriptu.
Účelem "use strict"
je uvést, že kód by měl být spuštěn v "přísném režimu".
V přísném režimu nemůžete například používat nedeklarované proměnné.
Všechny moderní prohlížeče podporují „použít přísné“ kromě Internet Exploreru 9 a nižších:
Directive | |||||
---|---|---|---|---|---|
"use strict" | 13.0 | 10.0 | 4.0 | 6.0 | 12.1 |
Čísla v tabulce určují první verzi prohlížeče, která plně podporuje direktivu.
Přísný režim můžete použít ve všech svých programech. Pomáhá vám psát čistší kód, jako bránit vám v používání nedeklarovaných proměnných.
"use strict"
je pouze řetězec, takže IE 9 nevyhodí chybu, i když jí nebude rozumět.
Přísný režim je deklarován přidáním "use strict"; na začátek skript nebo funkci.
Je deklarován na začátku skriptu a má globální rozsah (všechny kódy ve skriptu se spustí v přísném režimu):
"use strict";
x = 3.14; // This will cause an error
because x is not declared
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Using a variable without declaring it, is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
x = 3.14; // This will cause an error (x is not defined).
</script>
</body>
</html>
"use strict";
myFunction();
function myFunction() {
y = 3.14; // This will also cause an error
because y is not declared
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>Global "use strict" declaration.</h2>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
myFunction();
function myFunction() {
y = 3.14; // This will cause an error (y is not defined)
}
</script>
</body>
</html>
Deklarovaná uvnitř funkce má lokální rozsah (pouze kód uvnitř funkce je v přísném režimu):
x = 3.14; // This will not cause an error.
myFunction();
function
myFunction() {
"use strict";
y = 3.14; // This will cause an error
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p>"use strict" in a function will only cause errors in that function.</p>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
x = 3.14; // This will not cause an error.
myFunction();
function myFunction() {
"use strict";
y = 3.14; // This will cause an error (y is not defined).
}
</script>
</body>
</html>
Syntaxe pro deklaraci přísného režimu byla navržena tak, aby byla kompatibilní s starší verze JavaScriptu.
Kompilace číselného literálu (4 + 5;) nebo řetězcového literálu ("John Doe";) v JavaScript program nemá žádné vedlejší účinky. Jednoduše se zkompiluje do neexistujícího variabilní a zemře.
Takže "použít striktní";
záleží pouze na nových kompilátorech, kteří "chápou" význam toho.
Přísný režim usnadňuje psaní „zabezpečeného“ JavaScriptu.
Přísný režim mění dříve přijatou „špatnou syntaxi“ na skutečné chyby.
Například v normálním JavaScriptu nesprávným zadáním názvu proměnné vytvoříte novou globální proměnná. V přísném režimu to vyvolá chybu, která to znemožní k náhodnému vytvoření globální proměnné.
V normálním JavaScriptu vývojář neobdrží žádnou zpětnou vazbu o chybě přiřazování hodnot nezapisovatelným vlastnostem.
V přísném režimu jakékoli přiřazení k nezapisovatelné vlastnosti, pouze getter vlastnost, neexistující vlastnost, neexistující proměnná nebo neexistující objekt, vyvolá chybu.
Použití proměnné bez její deklarace není povoleno:
"use strict";
x = 3.14; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Using a variable without declaring it, is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
x = 3.14; // This will cause an error (x is not defined).
</script>
</body>
</html>
Objekty jsou také proměnné.
Použití objektu bez jeho deklarace není povoleno:
"use strict";
x = {p1:10, p2:20}; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Using an object without declaring it, is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
x = {p1:10, p2:20}; // This will cause an error (x is not defined).
</script>
</body>
</html>
Smazání proměnné (nebo objektu) není povoleno.
"use strict";
let x = 3.14;
delete x; // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Deleting a variable (or object) is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let x = 3.14;
delete x; // This will cause an error
</script>
</body>
</html>
Smazání funkce není povoleno.
"use strict";
function x(p1, p2) {};
delete x;
// This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Deleting a function is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
function x(p1, p2) {};
delete x; // This will cause an error
</script>
</body>
</html>
Duplikování názvu parametru není povoleno:
"use strict";
function x(p1, p1) {}; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Duplicating a parameter name is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
function x(p1, p1) {}; // This will cause an error
</script>
</body>
</html>
Osmičkové číselné literály nejsou povoleny:
"use strict";
let x = 010; // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Octal numeric literals are not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let x = 010; // This will cause an error
</script>
</body>
</html>
Osmičkové řídicí znaky nejsou povoleny:
"use strict";
let x = "\010"; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Octal escape characters are not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let x = "\010"; // This will cause an error
</script>
</body>
</html>
Zápis do vlastnosti pouze pro čtení není povolen:
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Writing to a read-only property is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // This will cause an error
</script>
</body>
</html>
Zápis do vlastnosti pouze pro získání není povolen:
"use strict";
const obj = {get x()
{return 0} };
obj.x = 3.14; // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Writing to a get-only property is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
const obj = {get x() {return 0} };
obj.x = 3.14; // This will cause an error
</script>
</body>
</html>
Smazání neodstranitelné vlastnosti není povoleno:
"use strict";
delete Object.prototype; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Deleting an udeletable property is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
delete Object.prototype; // This will cause an error
</script>
</body>
</html>
Slovo eval
nelze použít jako proměnnou:
"use strict";
let eval = 3.14; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>The string "eval" cannot be used as a variable.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let eval = 3.14; // This will cause an error
</script>
</body>
</html>
Slovo argumenty
nelze použít jako proměnnou:
"use strict";
let arguments = 3.14; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>The string "arguments" cannot be used as a variable.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let arguments = 3.14; // This will cause an error
</script>
</body>
</html>
Příkaz with
není povolen:
"use strict";
with (Math){x = cos(2)}; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>The with statement is not allowed.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
with (Math){x = cos(2)}; // This will cause an error
</script>
</body>
</html>
Z bezpečnostních důvodů není povoleno vytvářet eval()
proměnné v rozsahu, ze kterého byl volán.
V přísném režimu nelze proměnnou použít, dokud není deklarována:
"use strict";
eval ("x = 2");
alert (x); // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>For security reasons, eval() is not allowed to create variables in the scope from which it was called.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
eval ("x = 2");
alert (x); // This will cause an error
</script>
</body>
</html>
V přísném režimu nemůže eval() deklarovat proměnnou pomocí klíčového slova var:
"use strict";
eval ("var x = 2");
alert (x); // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>For security reasons, eval() is not allowed to create variables in the scope from which it was called.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
eval ("var x = 2");
alert (x); // This will cause an error
</script>
</body>
</html>
eval() nemůže deklarovat proměnnou pomocí klíčového slova let:
eval ("let x = 2");
alert (x); // This
will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>Using eval()</h2>
<h3>For security reasons, eval() is not allowed to create variables in the scope from which it was called.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
eval ("let x = 2");
alert (x); // This will cause an error
</script>
</body>
</html>
Klíčové slovo toto
ve funkcích se chová jinak v přísném režimu.
Klíčové slovo toto
odkazuje na objekt, který volala funkce.
Pokud objekt není zadán, funguje v přísném režimu vrátí undefined
a funguje normálně režim vrátí globální objekt (okno):
"use strict";
function myFunction() {
alert(this); // will alert "undefined"
}
myFunction();
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Inside functions, the "this" keyword is no longer the global object if not specified:</h3>
<script>
"use strict";
function myFunction() {
alert(this);
}
myFunction();
</script>
</body>
</html>
Klíčová slova vyhrazená pro budoucí verze JavaScriptu NELZE použít jako proměnné jména v přísném režimu.
Tyto jsou:
"use strict";
let public = 1500; // This will cause an error
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>With "use strict":</h2>
<h3>Future reserved keywords are not allowed in strict mode.</h3>
<p>Activate debugging in your browser (F12) to see the error report.</p>
<script>
"use strict";
let public = 1500; // This will cause an error
</script>
</body>
</html>
Direktiva "use strict" je rozpoznána pouze na začátku skriptu nebo funkci.