JavaScript - Strict Mode


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

Striktni 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 nestriktnom načinu rada ako varijablu inicijalizujete bez deklarisanja pomoću ključne riječi var (npr. X = 5;), JavaScript interpretator ć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 striktnom načinu. Zbog toga striktni 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, striktni način rada primjenjuje se na cijelu skriptu. Ali, striktni način rada možete uključiti i samo unutar funkcije, poput sljedećeg primjera:

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 striktnom načinu

Striktni 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 striktnom načinu:



Neprijavljene varijable nisu dozvoljene

Kao što već znate, u striktnom 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 striktnom 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 striktnom 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 striktnom 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 striktnom 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 striktnom 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 striktnom načinu "strict mode", iz sigurnosnih razloga, kod prosljeđen u metodu eval() ne može deklarisati / modifikovati varijable ili definisati funkcije u okolnom opsegu kao što to može u ne-striktnom načinu (non-strict mode).

"use strict";

eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined
Pogledajmo kako koristiti primjer u praksi:

<!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 striktnom načinu "strict mode", imena eval i arguments tretiraju se kao ključne riječi, pa se ne mogu koristiti kao imena varijabli, imena funkcija, 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 striktnom 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 Read-only nije dozvoljeno!

U striktnom načinu "strict mode", dodjeljivanje vrijednosti svojstvu koje se ne može zapisati, svojstvu samo za dobijanje ili nepostojećem svojstvu izbacuje grešku. U nestriktnom 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 Non-extensible objektu nije dozvoljeno!

U striktnom 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 nestriktnom 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 striktnom 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 o, 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 striktni 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 rezervisane 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, striktni 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 rezervisane ključne riječi kada se nalaze u striktnom 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.