JavaScript "použít přísné"


Obsah

    Zobrazit obsah


"use strict"; Definuje to JavaScript kód by měl být spuštěn v „přísný režim“.


Směrnice "použít striktně".

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.


Vyhlášení přísného režimu

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):

Příklad

"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>

Příklad

"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>


"použít přísné"; Syntax

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.


Proč Strict Mode?

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.


Není povoleno v přísném režimu

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 &quot;use strict&quot;:</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>

Budoucí důkaz!

Klíčová slova vyhrazená pro budoucí verze JavaScriptu NELZE použít jako proměnné jména v přísném režimu.

Tyto jsou:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"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>

Dávej si pozor!

Direktiva "use strict" je rozpoznána pouze na začátku skriptu nebo funkci.