
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:
"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:
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.
"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.
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxErrorTak samo przy próbie usunięcia funkcji w trybie ścisłym dostaniesz błąd składni:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxErrorPowtó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.
"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.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not definedeval 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.
"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.
"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ą.
"use strict";
var personne = {name: "Damien", age: 25};
Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeErrorDodanie 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ą.
"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"; // TypeErrorLiczby ó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.
"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,functioni tak dalej.
···


