JavaScript "brug strengt"


Indholdsfortegnelse

    Vis indholdsfortegnelse


"use strict"; Definerer det JavaScript-kode skal udføres i "streng tilstand".


Direktivet om "brug strengt".

"use strict"-direktivet var nyt i ECMAScript version 5.

Det er ikke et udsagn, men et bogstaveligt udtryk, ignoreret af tidligere versioner af JavaScript.

Formålet med "use strict" er at indikere, at koden skal udføres i "strict mode".

Med strict mode kan du for eksempel ikke bruge ikke-deklarerede variabler.

Alle moderne browsere understøtter "brug streng" undtagen Internet Explorer 9 og lavere:

Directive
"use strict" 13.0 10.0 4.0 6.0 12.1

Tallene i tabellen angiver den første browserversion, der fuldt ud understøtter direktivet.

Du kan bruge streng tilstand i alle dine programmer. Det hjælper dig med at skrive renere kode, som at forhindre dig i at bruge udeklarerede variabler.

"use strict" er kun en streng, så IE 9 vil ikke give en fejl, selvom den ikke forstår den.


Erklærer streng tilstand

Strict tilstand erklæres ved at tilføje "use strict"; til begyndelsen af en script eller en funktion.

Erklæret i begyndelsen af et script, det har globalt omfang (al kode i scriptet udføres i streng tilstand):

Eksempel

"use strict";
x = 3.14;       // This will cause an error 
 because x is not declared

Prøv det selv →

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

Eksempel

"use strict";
myFunction();

function myFunction() {
   y = 3.14;   // This will also cause an error 
 because y is not declared
}

Prøv det selv →

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

Erklæret inde i en funktion har den lokalt omfang (kun koden inde i funktionen er i streng tilstand):

x = 3.14;       // This will not cause an error.
 
myFunction();
function 
 myFunction() {
  "use strict";
    y = 3.14;   // This will cause an error
}

Prøv det selv →

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


Den "brug streng"; Syntaks

Syntaksen til at erklære streng tilstand blev designet til at være kompatibel med ældre versioner af JavaScript.

Kompilering af en numerisk literal (4 + 5;) eller en streng literal ("John Doe";) i en JavaScript-programmet har ingen bivirkninger. Den kompilerer simpelthen til en ikke-eksisterende variabel og dør.

"use strict"; betyder kun noget for nye compilere, der "forstår" betydningen af det.


Hvorfor streng tilstand?

Strict mode gør det nemmere at skrive "sikker" JavaScript.

Strenge tilstand ændrer tidligere accepteret "dårlig syntaks" til rigtige fejl.

Som et eksempel, i normal JavaScript, skaber fejltastning af et variabelnavn et nyt global variabel. I streng tilstand vil dette give en fejl, hvilket gør det umuligt ved et uheld at oprette en global variabel.

I normal JavaScript vil en udvikler ikke modtage nogen fejlfeedback tildele værdier til ikke-skrivbare egenskaber.

I streng tilstand er enhver tildeling til en ikke-skrivbar ejendom kun en getter egenskab, en ikke-eksisterende egenskab, en ikke-eksisterende variabel eller en ikke-eksisterende objekt, vil give en fejl.


Ikke tilladt i streng tilstand

Det er ikke tilladt at bruge en variabel uden at deklarere den:

"use strict";
 x = 3.14;                // This will cause an error

Prøv det selv →

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

Objekter er også variable.

Det er ikke tilladt at bruge et objekt uden at angive det:

"use strict";
 x = {p1:10, p2:20};      // This will cause an error

Prøv det selv →

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

Det er ikke tilladt at slette en variabel (eller et objekt).

"use strict";
let x = 3.14;
delete x;                // This 
will cause an error

Prøv det selv →

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

Det er ikke tilladt at slette en funktion.

"use strict";
function x(p1, p2) {}; 
delete x;                
 // This will cause an error 

Prøv det selv →

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

Duplikere et parameternavn er ikke tilladt:

"use strict";
function x(p1, p1) {};   // This will cause an error

Prøv det selv →

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

Oktale numeriske bogstaver er ikke tilladt:

"use strict";
let x = 010;             // This 
will cause an error

Prøv det selv →

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

Oktale escape-tegn er ikke tilladt:

"use strict";
let x = "\010";            // This will cause an error

Prøv det selv →

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

Det er ikke tilladt at skrive til en skrivebeskyttet ejendom:

"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;            // This 
will cause an error

Prøv det selv →

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

Det er ikke tilladt at skrive til en ejendom, der kun kan fås:

"use strict";
const obj = {get x() 
{return 0} };
obj.x = 3.14;            // This 
will cause an error

Prøv det selv →

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

Det er ikke tilladt at slette en egenskab, der ikke kan slettes:

"use strict";
delete Object.prototype; // This will cause an error

Prøv det selv →

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

Ordet eval kan ikke bruges som en variabel:

"use strict";
let eval = 3.14;         // This will cause an error

Prøv det selv →

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

Ordet argumenter kan ikke bruges som en variabel:

"use strict";
let arguments = 3.14;    // This will cause an error

Prøv det selv →

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

with-sætningen er ikke tilladt:

"use strict";
with (Math){x = cos(2)}; // This will cause an error

Prøv det selv →

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

Af sikkerhedsmæssige årsager må eval() ikke oprette variabler i det omfang, hvorfra det blev kaldt.

I streng tilstand kan en variabel ikke bruges, før den er erklæret:

"use strict";
eval ("x = 2");
alert (x);      // This 
will cause an error

Prøv det selv →

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

I streng tilstand kan eval() ikke erklære en variabel ved hjælp af nøgleordet var:

"use strict";
eval ("var x = 2");
alert (x);    // This 
will cause an error

Prøv det selv →

<!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() kan ikke erklære en variabel ved hjælp af let nøgleordet:

eval ("let x = 2");
alert (x);        // This 
will cause an error

Prøv det selv →

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

dette nøgleordet i funktioner opfører sig anderledes i streng tilstand.

dette nøgleordet refererer til det objekt, der kaldet funktionen.

Hvis objektet ikke er angivet, fungerer det i streng tilstand returnerer undefined og fungerer som normalt tilstand returnerer det globale objekt (vindue):

"use strict";
function myFunction() {
  
  alert(this); // will alert "undefined"
}
myFunction(); 

Prøv det selv →

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

Fremtidssikret!

Nøgleord, der er reserveret til fremtidige JavaScript-versioner, kan IKKE bruges som variable navne i streng tilstand.

Disse er:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
let public = 1500;      // This will cause an error

Prøv det selv →

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

Pas på!

Direktivet "brug strengt" genkendes kun i begyndelsen af et script eller en funktion.