JavaScript - Strict Mode


Šta je strogi način (Strict Mode)?

Strogi način rada uveden je u ECMAScript 5 (ES5). To je semantički stroža ili ograničena verzija JavaScript jezika koja stvara greške za one greške kojima se u suprotnom rukuje tiho. Na primjer, u nestrogom načinu rada ako varijablu inicijalizirate bez deklarisanja pomoću ključne riječi var (npr. X = 5;), interpretator JavaScript će pretpostaviti da ste upućivali na globalnu varijablu i ako takva varijabla nije postojala, automatski će se stvori jedan. Takođe, funkcije koje su zastarjele mogu takođe generisati greške u strogom načinu. Zbog toga strogi način rada smanjuje greške, poboljšava sigurnost i ukupne performanse vaše aplikacije.



Omogućavanje strogog načina (Strict Mode)

Da biste omogućili strogi način rada, potrebno je samo dodati string "use strict" na početak skripte, kao što je prikazano u sljedećem primjeru:

"use strict";

// Sav vaš kod ide ovdje
x = 5; // ReferenceError: x is not defined
console.log(x);
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Omogćavanje Strict Mode</title>
</head>
<body>
    <script>
    "use strict";

    // Sav vaš kod ide ovdje
    x = 5; // ReferenceError: x is not defined
    console.log(x);
    </script>
</body>
</html>

Ako dodate direktivu "use strict" kao prvi red vašeg JavaScript programa, strogi način rada primjenjuje se na cijelu skriptu. Ali, strogi način rada možete uključiti i samo unutar funkcije, poput ove:

x = 5;
console.log(x); // 5

function sayHello() {
    "use strict";
    str = "Hello World!"; // ReferenceError: str is not defined
    console.log(str);
}
sayHello();
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Omogućavanje Strict Mode unutar funkcije</title>
</head>
<body>
    <script>
    x = 5;
    console.log(x); // 5
    
    function sayHello() {
        "use strict";
        str = "Hello World!"; // ReferenceError: str is not defined
        console.log(str);
    }
    sayHello();
    </script>
</body>
</html>


Opšta ograničenja u strogom načinu

Strogi način rada mijenja sintaksu i ponašanje vremena izvođenja. U sljedećim dijelovima ćemo pogledati opšta ograničenja koja se provode u strogom načinu:



Neprijavljene varijable nisu dozvoljene

Kao što već znate, u strogom načinu rada moraju se deklarisati sve varijable. Ako dodijelite vrijednost identifikatoru koji nije deklarisana varijabla, izbacit će se ReferenceError.

"use strict";

function doSomething() {
    msg = "Volim da učim uz IT TUTORIJALE!"; // ReferenceError: msg is not defined
    return msg;
}
console.log(doSomething());
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Nije moguće dodijeliti neprijavljenoj varijabli u strogom načinu</title>
</head>
<body>
    <script>
    "use strict";

    function doSomething() {
        msg = "Volim da učim uz IT TUTORIJALE!"; // ReferenceError: msg is not defined
        return msg;
    }
    console.log(doSomething());
    </script>

</body>
</html>


Brisanje varijable ili funkcije nije dozvoljeno

U strogom načinu rada, ako pokušate izbrisati varijablu ili funkciju, pojaviće se sintaksna greške. Dok, u nesigurnom načinu, takav pokušaj ne uspijeva tiho i izraz delete ocjenjuje se kao false.

"use strict";

var person = {name: "Miloš", age: 29};
delete person; // SyntaxError
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Nije moguće izbrisati varijablu u strogom načinu</title>
</head>
<body>
    <script>
    "use strict";

    var person = {name: "Miloš", age: 29};
    delete person; // SyntaxError
    </script>
</body>
</html>

Slično tome, kada pokušate izbrisati funkciju u strogom načinu, dobićete sintaksnu grešku:

"use strict";

function sum(a, b) {
    return a + b;
}
delete sum; // SyntaxError


Duplikacija naziva parametra nije dozvoljeno

U strogom načinu rada, pojaviće se sintaksna greška ako deklaracija funkcije ima dva ili više parametara s istim imenom. U nesigurnom načinu rada ne dolazi do greške.

"use strict";

function square(a, a) { // SyntaxError
    return a * a;
}
console.log(square(2, 2));
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Duplikacija naziva parametra</title>
</head>
<body>
    <script>
    "use strict";

    function square(a, a) { // SyntaxError
        return a * a;
    }
    console.log(square(2, 2));
    </script>
</body>
</html>


Eval metoda ne može promijeniti opseg

U strogom načinu "strict mode", iz sigurnosnih razloga, kod proslijeđen u metodu eval() ne može deklarisati / modifikovati varijable ili definisati funkcije u okolnom opsegu kao što to može u ne-strogom načinu (non-strict mode).

"use strict";

eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
E

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Eval metoda ne može promijeniti opseg</title>
</head>
<body>
    <script>
    "use strict";

    eval("var x = 5;");
    console.log(x); // ReferenceError: x is not defined
    </script>
</body>
</html>


Eval i argumenti se ne mogu koristiti kao identifikatori

U strogom načinu "strict mode", imena eval i argumenti tretiraju se kao ključne riječi, pa se ne mogu koristiti kao imena varijabli, imena funkcija ili kao parametri funkcije itd.

"use strict";

var eval = 10; // SyntaxError
console.log(eval);
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Eval i argumenti se ne mogu koristiti kao identifikatori u Strict Mode</title>
</head>
<body>
    <script>
    "use strict";

    var eval = 10; // SyntaxError
    console.log(eval);
    </script>
</body>
</html>


With izjava nije dozvoljena

U strogom načinu "strict mode", naredba with nije dozvoljena. Izraz with dodaje svojstva i metode objekta trenutnom opsegu. Dakle, izrazi ugniježdeni unutar naredbe with mogu direktno pozvati svojstva i metode objekta bez da ga upućuju.

"use strict";

// Bez with izjave
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;

// Korištenje with izjave
var radius2 = 5;
with(Math) { // SyntaxError
    var area2 = PI * radius2 * radius2;
} 
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Strict Mode ne može da sadrži with izjave</title>
</head>
<body>
    <script>
    "use strict";

    // Bez with izjave
    var radius1 = 5;
    var area1 = Math.PI * radius1 * radius1;
    
    // Korištenje with izjave
    var radius2 = 5;
    with(Math) { // SyntaxError
        var area2 = PI * radius2 * radius2;
    } 
    </script>
</body>
</html>


Zapisivanje u svojstvo samo za čitanje nije dozvoljeno

U strogom načinu "strict mode", dodjeljivanje vrijednosti svojstvu koje se ne može zapisati, svojstvu samo za dobijanje ili nepostojećem svojstvu izbaciće grešku. U nestrogom načinu ti pokušaji tiho propadaju.

"use strict";

var person = {name: "Miloš", age: 29};

Object.defineProperty(person, "gender", {value: "male", writable: false});
person.gender = "female"; // TypeError
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Ne može se dodijeliti svojstvu objekta samo za čitanje u Strict Mode</title>
</head>
<body>
    <script>
    "use strict";

    var person = {name: "Miloš", age: 29};
    
    Object.defineProperty(person, "gender", {value: "male", writable: false});
    person.gender = "female"; // TypeError
    </script>
</body>
</html>


Dodavanje novog svojstva neproširivog Non-extensible objektu nije dozvoljeno

U strogom načinu "strict mode", pokušaji stvaranja novih svojstava na ne proširivim ili nepostojećim objektima takođe će dovesti do greške. Ali u nestrogom načinu, ti pokušaji tiho propadaju.

"use strict";

var person = {name: "Miloš", age: 29};

console.log(Object.isExtensible(person)); // true
Object.freeze(person); // zaključavanje predmet person
console.log(Object.isExtensible(person)); // false
person.gender = "male"; // TypeError
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Ne može se dodati svojstvo na-neproširivi objekt u Strict Mode</title>
</head>
<body>
    <script>
    "use strict";

    var person = {name: "Miloš", age: 29};
    
    console.log(Object.isExtensible(person)); // true
    Object.freeze(person); // zaključavanje predmet person
    console.log(Object.isExtensible(person)); // false
    person.gender = "male"; // TypeError
    </script>
</body>
</html>


Oktalni brojevi nisu dozvoljeni

U strogom načinu rada "strict mode", oktalni brojevi (brojevi s prefiksom nule, npr. 010, 0377) nisu dozvoljeni. Iako je podržan u svim pretraživačima u nesigurnom načinu rada. Međutim, u ES6 podržavaju se oktalni brojevi dodavanjem broja 0 sa 0, tj. 0o10, 0o377 itd.

"use strict";

var x = 010; // SyntaxError
console.log(parseInt(x));
Pogledajmo kako koristiti primjer u praksi:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JavaScript Oktalni literali nisu dozvoljeni u  Strict Mode</title>
</head>
<body>
    <script>
    "use strict";

    var x = 010; // SyntaxError
    console.log(parseInt(x));
    </script>
</body>
</html>

U gornjim primjerima možete jasno vidjeti kako vam strogi način "strict mode" može pomoći u sprječavanju uobičajenih grešaka koje često ostaju neprimijećene tokom pisanja JavaScript programa.



Ključne riječi rezervirane za budućnost nisu dozvoljene

Kao što već znate iz prethodnih lekcija, rezervisane riječi ne mogu se koristiti kao identifikator (imena varijabli, imena funkcija i oznake petlje) u JavaScript programu. Uz to, strogi način rada takođe nameće ograničenja na upotrebu onih ključnih riječi koje su rezervirane za budućnost. Prema najnovijim standardima ECMAScript 6 (ili ES6), ove ključne riječi su rezervirane ključne riječi kada se nalaze u strogom kodu načina rada: await, implements, interface, package, private, protected, public i static. Međutim, za optimalnu kompatibilnost izbjegavajte korištenje rezervisanih ključnih riječi kao imena varijabli ili imena funkcija u vašem programu.