Mając obsesję na punkcie wyrównywania literałów liczbowych, deweloper nieumyślnie zainicjował zmienną b
literałem ósemkowym. Tryb nie-ścisły zinterpretuje to jako literał liczbowy z wartością 24
(w podstawie 10). Jednak tryb ścisły zgłosi błąd.
Zakres
Historycznie JavaScript był mylony co do zakresu funkcji. Czasami wydaje się, że mają zakres statyczny, ale niektóre cechy sprawiają, że zachowują się tak, jakby miały zakres dynamiczny. Jest to mylące, przez co programy są trudne do odczytania i zrozumienia. Nieporozumienie powoduje błędy. Jest to również problem z wydajnością. Scopowanie statyczne pozwoliłoby na wiązanie zmiennych w czasie kompilacji, ale wymóg dotyczący zakresu dynamicznego oznacza, że wiązanie musi zostać odroczone do czasu wykonywania, co wiąże się ze znaczną utratą wydajności.
Tryb ścisły wymaga, aby wszystkie wiązania zmiennych były wykonywane statycznie. Oznacza to, że funkcje, które wcześniej wymagały powiązania dynamicznego, muszą zostać wyeliminowane lub zmodyfikowane. W szczególności instrukcja with została wyeliminowana, a zdolność funkcji eval do manipulowania środowiskiem jej rozmówcy jest poważnie ograniczona.
Jedną z zalet ścisłego kodu jest to, że narzędzia takie jak YUI Compressor
mogą wykonać lepszą pracę podczas jego przetwarzania.
Domniemane zmienne globalne
JavaScript sugeruje zmienne globalne. Jeśli nie zadeklarujesz wyraźnie zmiennej, zmienna globalna zostanie dla Ciebie domyślnie zadeklarowana. Ułatwia to programowanie początkującym, ponieważ mogą zaniedbać niektóre z podstawowych obowiązków domowych. Ale znacznie utrudnia zarządzanie większymi programami i znacznie obniża niezawodność. W trybie ścisłym implikowane zmienne globalne nie są już tworzone. Powinieneś jawnie zadeklarować wszystkie swoje zmienne.
Globalny wyciek
Istnieje wiele sytuacji, które mogą spowodować this
powiązanie z obiektem globalnym. Na przykład, jeśli zapomnisz podać new
prefiks podczas wywoływania funkcji konstruktora, konstruktor this
zostanie nieoczekiwanie związany z obiektem globalnym, więc zamiast inicjować nowy obiekt, będzie on po cichu manipulował zmiennymi globalnymi. W takich sytuacjach, tryb ścisły będzie zamiast wiązać this
się undefined
, co spowoduje konstruktora wyjątek zamiast, pozwalając błąd mają być wykrywane znacznie wcześniej.
Głośna awaria
JavaScript zawsze miał właściwości tylko do odczytu, ale nie można było ich utworzyć samodzielnie, dopóki Object.createProperty
funkcja ES5 nie ujawni tej możliwości. Jeśli spróbujesz przypisać wartość do właściwości tylko do odczytu, zakończy się ona niepowodzeniem w trybie cichym. Przypisanie nie zmieniłoby wartości właściwości, ale twój program działałby tak, jakby miał. Jest to zagrożenie integralności, które może spowodować, że programy przejdą w niespójny stan. W trybie ścisłym próba zmiany właściwości tylko do odczytu spowoduje zgłoszenie wyjątku.
Octal
Oktalowa (lub podstawowa 8) reprezentacja liczb była niezwykle użyteczna podczas programowania na poziomie maszyny na komputerach, których rozmiar słowa był wielokrotnością 3. Potrzebowałeś ósemki podczas pracy z komputerem mainframe CDC 6600, który miał rozmiar słowa 60 bitów. Jeśli potrafisz czytać ósemkę, możesz spojrzeć na słowo jako 20 cyfr. Dwie cyfry reprezentują kod operacji, a jedna cyfra identyfikuje jeden z 8 rejestrów. Podczas powolnego przechodzenia od kodów maszynowych do języków wysokiego poziomu uznano, że przydatne jest dostarczanie formularzy ósemkowych w językach programowania.
W C wybrano wyjątkowo niefortunną reprezentację oktalności: wiodące zero. Tak więc w C 0100
oznacza 64, a nie 100, i 08
jest błędem, a nie 8. Co więcej, ten anachronizm został skopiowany do prawie wszystkich współczesnych języków, w tym JavaScript, gdzie jest używany tylko do tworzenia błędów. Nie ma innego celu. W trybie ścisłym formy ósemkowe nie są już dozwolone.
I tak dalej
Pseudo-tablica argumentów staje się bardziej podobna do tablicy w ES5. W trybie ścisłym traci swoje callee
i caller
właściwości. Umożliwia to przekazanie arguments
kodu do niezaufanego kodu bez rezygnacji z poufnego kontekstu. Ponadto
arguments
właściwość funkcji jest eliminowana.
W trybie ścisłym duplikowanie kluczy w literale funkcji spowoduje błąd składniowy. Funkcja nie może mieć dwóch parametrów o tej samej nazwie. Funkcja nie może mieć zmiennej o takiej samej nazwie jak jeden z jej parametrów. Funkcja nie może mieć delete
własnych zmiennych. Próba
delete
właściwości nieskonfigurowanej powoduje teraz wyjątek. Wartości pierwotne nie są niejawnie opakowane.
ECMAScript 5 dodaje listę słów zastrzeżonych. Jeśli użyjesz ich jako zmiennych lub argumentów, tryb ścisły zgłosi błąd. Zastrzeżone słowa to: