JavaScript strict mode: use strict i co naprawdę zmienia

Czym jest tryb ścisły? Pojawił się w ECMAScript 5 (ES5) jako bardziej rygorystyczny wariant JavaScriptu, który zgłasza błędy tam, gdzie zwykle wszystko przechodzi w milczeniu. Przykład: w trybie zwykłym przypisanie wartości do niezadeklarowanej zmiennej tworzy zmienną globalną.

JavaScript strict mode: use strict i co naprawdę zmienia

Czym jest tryb ścisły?

Tryb ścisły pojawił się w ECMAScript 5 (ES5). To bardziej rygorystyczny wariant JavaScriptu, który zgłasza błędy tam, gdzie zwykle wszystko przechodzi w milczeniu. Przykład: w trybie zwykłym, kiedy nadasz zmiennej wartość bez zadeklarowania jej słowem kluczowym var (na przykład x = 5, ), interpreter JavaScriptu uzna, że chodzi o zmienną globalną, a jeśli taka nie istnieje, sam ją utworzy.

Do tego przestarzałe funkcje również potrafią w trybie ścisłym rzucić błąd. Tryb ścisły ogranicza więc liczbę bugów i poprawia zarówno bezpieczeństwo, jak i ogólną wydajność aplikacji.

Włączanie trybu ścisłego

Żeby włączyć tryb ścisły, wystarczy dopisać łańcuch znaków „use strict” na początku skryptu, jak w poniższym przykładzie:

javascript
"use strict";
x = 5; // ReferenceError: x is not defined
console.log(x);

Jeśli umieścisz dyrektywę „use strict” w pierwszej linii programu, tryb ścisły obejmie cały skrypt. Możesz go też włączyć wyłącznie wewnątrz funkcji, o tak:

javascript
x = 5;
console.log(x); // 5
function sayHello() {
    "use strict";
    str = "Hello World!"; // ReferenceError: str is not defined
    console.log(str);
}
sayHello();

Warto wiedzieć: dyrektywa „use strict” jest rozpoznawana tylko na początku skryptu albo funkcji. Wszystkie współczesne przeglądarki ją obsługują, poza Internet Explorerem 9 i starszymi. Przeglądarki, które jej nie obsługują, po prostu ją pomijają i parsują JavaScript w trybie zwykłym.

Ogólne ograniczenia trybu ścisłego

Tryb ścisły zmienia zarówno składnię, jak i zachowanie w czasie wykonania. W kolejnych sekcjach przechodzimy przez ograniczenia, które wprowadza:

Niezadeklarowane zmienne są zabronione

Jak już wiesz, w trybie ścisłym każda zmienna musi być zadeklarowana. Przypisanie wartości do identyfikatora, który nie jest zadeklarowaną zmienną, kończy się błędem ReferenceError.

javascript
"use strict";

function doSomething() {
    msg = "Hello world!"; // ReferenceError: msg is not defined
    return msg;
}
console.log(doSomething());

Usunięcie zmiennej albo funkcji jest zabronione

W trybie ścisłym próba usunięcia zmiennej lub funkcji daje błąd składni. W trybie zwykłym taka próba po cichu zawodzi, a wyrażenie delete zwraca false.

javascript
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxError

Tak samo przy próbie usunięcia funkcji w trybie ścisłym dostaniesz błąd składni:

javascript
"use strict";
function sum(a, b) {
    return a + b;
}
delete sum; // SyntaxError

Powtórzona nazwa parametru jest zabroniona

W trybie ścisłym deklaracja funkcji z dwoma parametrami o tej samej nazwie kończy się błędem składni. W trybie zwykłym nie dzieje się nic.

javascript
"use strict";

function test(a, a) { // SyntaxError
    return a * a;
}
console.log(square(2, 2));

eval() nie może zmieniać zasięgu

W trybie ścisłym, ze względów bezpieczeństwa, kod przekazany do eval() nie może deklarować ani zmieniać zmiennych, ani definiować funkcji w otaczającym środowisku, co jest możliwe w trybie zwykłym.

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

eval i arguments nie mogą być identyfikatorami

W trybie ścisłym nazwy eval i arguments są traktowane jak słowa kluczowe, więc nie da się ich użyć jako nazwy zmiennej, funkcji, parametru i tak dalej.

javascript
"use strict";
var eval = 10; // SyntaxError
console.log(eval);

Instrukcja with jest zabroniona

W trybie ścisłym instrukcja with jest zabroniona. Instrukcja with dodaje właściwości i metody obiektu do bieżącego zasięgu, dzięki czemu instrukcje zagnieżdżone w bloku with mogą wołać właściwości i metody obiektu bezpośrednio, bez odwoływania się do niego.

javascript
"use strict";

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

// Z with
var radius2 = 5;
with(Math) { // SyntaxError
    var area2 = PI * radius2 * radius2;
} 

Zapis do właściwości tylko do odczytu jest zabroniony

W trybie ścisłym przypisanie wartości do właściwości niezapisywalnej, do właściwości mającej tylko getter albo do właściwości nieistniejącej rzuca błąd. W trybie zwykłym takie próby cicho zawodzą.

javascript
"use strict";

var personne = {name: "Damien", age: 25};

Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeError

Dodanie właściwości do obiektu nierozszerzalnego jest zabronione

W trybie ścisłym próba utworzenia nowych właściwości na obiektach nierozszerzalnych albo nieistniejących również rzuca błąd. W trybie zwykłym kończy się cichą porażką.

javascript
"use strict";

var person = {name: "Damien", age: 25};

console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); //  zablokowanie obiektu personne
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeError

Liczby ósemkowe są niedozwolone

W trybie ścisłym liczby ósemkowe (cyfry poprzedzone zerem, na przykład 010, 0377) są zabronione. W trybie zwykłym obsługują je wszystkie przeglądarki. W ES6 liczby ósemkowe zapisuje się z przedrostkiem 0o, czyli 0o10, 0o377 i tak dalej.

javascript
"use strict";

var x = 010; // SyntaxError
console.log(parseInt(x));

Powyższe przykłady dobrze pokazują, jak tryb ścisły pomaga unikać typowych pomyłek, które przy pisaniu programu w JavaScripcie zwykle przechodzą niezauważone.

Słowa kluczowe zarezerwowane na przyszłość są zabronione

Tryb ścisły nakłada ograniczenia na użycie słów kluczowych zarezerwowanych na przyszłość.

Zgodnie z najnowszym standardem ECMAScript 6 (czyli ES6) w trybie ścisłym zarezerwowane są następujące słowa kluczowe: await, implements, interface, package, private, protected, public i static. Dla najlepszej zgodności i tak lepiej nie używać słów zarezerwowanych jako nazw zmiennych ani funkcji w żadnym miejscu programu.

Wskazówka: słowa zarezerwowane, nazywane też słowami kluczowymi, to specjalne wyrazy należące do składni JavaScriptu, na przykład var, if, for, function i tak dalej.

···

JavaScript

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.