Co robi „JavaScript” w JavaScript i jakie jest jego uzasadnienie?


7547

Niedawno uruchomiłem część mojego kodu JavaScript przez JSLint Crockforda , co spowodowało następujący błąd:

Problem w wierszu 1 znaku 1: Brak instrukcji „użyj ścisłej”.

Podczas wyszukiwania zauważyłem, że niektórzy ludzie dodają "use strict";do kodu JavaScript. Po dodaniu instrukcji błąd przestał się pojawiać. Niestety Google nie ujawniło dużej części historii tego oświadczenia. Z pewnością musi to mieć związek z interpretacją JavaScript w przeglądarce, ale nie mam pojęcia, jaki byłby efekt.

O co w tym "use strict";wszystkim chodzi, co to oznacza i czy nadal jest aktualne?

Czy którakolwiek z obecnych przeglądarek reaguje na "use strict";ciąg znaków, czy jest on do wykorzystania w przyszłości?


5
Odpowiedzi tutaj są stare, ale są błędne. Głównym powodem trybu ścisłego nie było zapobieganie błędom programistycznym - było to, aby JavaScript miał zakres leksykalny, aby mógł być statystycznie analizowany:]
Benjamin Gruenbaum

@BenjaminGruenbaum Używanie "use strict";samego siebie nie powoduje, że JS ma zasięg leksykalny. Deklarowanie zmiennych przy pomocy leti constpowinno być również używane.
Koorosh Pasokhi

Zmieszasz zakresy bloków i zakresy leksykalne.
Benjamin Gruenbaum

Odpowiedzi:


4937

Ten artykuł o Javascript Strict Mode może Cię zainteresować: John Resig - ECMAScript 5 Strict Mode, JSON i więcej

Aby zacytować kilka interesujących części:

Tryb ścisły to nowa funkcja w ECMAScript 5, która pozwala umieścić program lub funkcję w „ścisłym” kontekście operacyjnym. Ten ścisły kontekst zapobiega podejmowaniu niektórych działań i rzuca więcej wyjątków.

I:

Tryb ścisły pomaga na kilka sposobów:

  • Łapie niektóre popularne bloopery kodujące, rzucając wyjątki.
  • Zapobiega lub rzuca błędy, gdy podejmowane są stosunkowo „niebezpieczne” działania (takie jak uzyskanie dostępu do obiektu globalnego).
  • Wyłącza funkcje, które są mylące lub źle przemyślane.

Pamiętaj też, że możesz zastosować „tryb ścisły” do całego pliku ... Możesz też użyć go tylko do określonej funkcji (wciąż cytowanie z artykułu Johna Resiga) :

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

Co może być pomocne, jeśli musisz mieszać stary i nowy kod ;-)

Przypuszczam, że to trochę tak, jak "use strict"można używać w Perlu (stąd nazwa?) : Pomaga popełnić mniej błędów, wykrywając więcej rzeczy, które mogą prowadzić do awarii.

Tryb ścisły jest teraz obsługiwany przez wszystkie główne przeglądarki .

W natywnych modułach ECMAScript (z instrukcjami importi export) oraz klasach ES6 tryb ścisły jest zawsze włączony i nie można go wyłączyć.


100
Zmieniasz domyślne po tylu latach? Na to za późno: zepsułoby tak wiele istniejących witryn / skryptów / aplikacji ... Jedyną możliwą rzeczą jest poprawienie sytuacji na przyszłość.
Pascal MARTIN

14
Próbowałem małego fragmentu kodu, który byłby nieprawidłowy podczas używania "use strict"w Firefox 3.6, Safari 5, Chrome 7 i Opera 10.6 (wszystkie komputery Mac). Żadnych błędów, więc myślę, że 'use strict' nie jest jeszcze obsługiwany w żadnej przeglądarce. Nie testowałem jednak w IE9;)
Husky

11
Szybka aktualizacja: Firefox 4 ma pełną obsługę trybu ścisłego i, o ile wiem, żadna inna przeglądarka nie. Safari i Chrome mają „częściową” obsługę, ale tak naprawdę nie wiem, co to oznacza.
Sasha Chedygov

29
Chrome 11 zdaje się przejść wszystkie te testy, podobnie jak IE10 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html#
gman

12
@Julius - Nie można tego zaimplementować przy użyciu zarezerwowanego słowa kluczowego, ponieważ wówczas próba uruchomienia trybu ścisłego spowodowałaby awarię starych przeglądarek. Dodanie „losowego” literału łańcuchowego niczego nie psuje.
nnnnnn

1245

Jest to nowa funkcja ECMAScript 5. John Resig napisał ładne podsumowanie tego.

To tylko ciąg, który umieszczasz w swoich plikach JavaScript (na górze pliku lub wewnątrz funkcji), który wygląda następująco:

"use strict";

Umieszczenie go w kodzie teraz nie powinno powodować żadnych problemów z bieżącymi przeglądarkami, ponieważ jest to tylko ciąg znaków. Może to powodować problemy z kodem w przyszłości, jeśli kod narusza pragmę. Na przykład, jeśli obecnie foo = "bar"nie zdefiniowałeś foo, kod zacznie się nie powieść ... co jest moim zdaniem dobrą rzeczą.


328
Zawodzą szybko i zawodzą głośno.
Niels Bom

31
Jeśli piszesz JavaScript w plikach HTML, rozpocznij każdy nowy blok od <script>"use strict";. Flaga dotyczy tylko bloku, w którym jest uwzględniona.
nobar

7
To zabawne, w wyniku czego łańcuchy muszą zawierać pojedyncze cudzysłowy. Napisz więc 'use strict';zamiast tego
nilsi

1
co by się stało z podnoszącą koncepcją javascript?
Sunil Sharma

1
@SunilSharma Jeśli spróbujesz podnieść, ale nie powiedzie się, ponieważ zmienna nie jest zdefiniowana, w tej chwili doda ją do obiektu globalnego. Dzięki "use strict";, to nie zamiast. Ma to większy sens, ponieważ dodanie go do obiektu globalnego oznacza, że ​​może on nie działać przy następnym uruchomieniu funkcji / zrobić coś innego, co zresetuje blok, tak jak będzie w najwyższym bloku (globalnym).
wizzwizz4

646

Oświadczenie "use strict";instruuje przeglądarkę na stosowanie trybu surowe, która jest zmniejszona i bezpieczniejsze zestaw funkcji JavaScriptu.

Lista funkcji (niewyczerpująca)

  1. Nie zezwala na zmienne globalne. (Łapie brakujące vardeklaracje i literówki w nazwach zmiennych)

  2. Ciche niepomyślne przypisania spowodują błąd w trybie ścisłym (przypisywanie NaN = 5;)

  3. Próby usunięcia nieusuwalnych właściwości throw ( delete Object.prototype)

  4. Wymaga, aby wszystkie nazwy właściwości w literale obiektu były unikalne ( var x = {x1: "1", x1: "2"})

  5. Nazwy parametrów funkcji muszą być unikalne ( function sum (x, x) {...})

  6. Zabrania składni ósemkowej ( var x = 023;niektórzy deweloperzy błędnie zakładają, że poprzedzające zero nie robi nic, aby zmienić liczbę).

  7. Zabrania withsłowa kluczowego

  8. eval w trybie ścisłym nie wprowadza nowych zmiennych

  9. Zabrania usuwania zwykłych nazw ( delete x;)

  10. Zabrania wiążących lub przyporządkowanie nazwy evali argumentsw dowolnej formie

  11. Tryb ścisły nie aliasuje właściwości argumentsobiektu z parametrami formalnymi. (tj. w function sum (a,b) { return arguments[0] + b;}Działa, ponieważ arguments[0]jest związany ai tak dalej.)

  12. arguments.callee nie jest wspierany

[Ref: Tryb ścisły , Mozilla Developer Network ]


40
Nit: zmienne globalne są dozwolone, po prostu muszą być jawne (np window.foo = bar.).
gcampbell

1
Wymaga, aby wszystkie nazwy właściwości w literale obiektu były unikalne (var x = {x1: „1”, x1: „2”})) - jest to poprawne
Arun Killu

4
W twoim przykładzie w 11 brakuje modyfikacji (inaczej nie ma to sensu). I. e. funkcja suma (a, b) {a = 0; zwracaj argumenty [0] + b; } alert (suma (1, 2)) zwróci 3 w trybie ścisłym i 2 bez trybu ścisłego z powodu aliasingu.
David Gausmann

413

Jeśli ludzie martwią się użyciem use strict, warto sprawdzić ten artykuł:

ECMAScript 5 Obsługa trybu ścisłego w przeglądarkach. Co to znaczy?
NovoGeek.com - blog Krishny

Mówi o wsparciu przeglądarki, ale co ważniejsze, jak sobie z nią bezpiecznie poradzić:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

116
Nie zgadzam się. Myślę, że to pokazuje, dlaczego jest to bardzo przydatne. Zasadniczo oznacza to, że funkcja ta zwraca swoją funkcję, a niewindow
Jamie Hutber

36
kiedy chcesz okna, za pomocą thisktórego nie możesz celować window?
Jamie Hutber,

14
Odnosi się do siebie. thisnależy do jego własnej funkcji, a nie do globalnego okna
Jamie Hutber

26
W drugim thisjest tak naprawdę undefined.
Broxzier

14
Chodzi o to, że twój program JS zacznie się nie powieść z powodu dostępu do właściwości niezdefiniowanej, zamiast po cichu robić niewłaściwe działanie na obiekcie globalnym. Znacznie ułatwia śledzenie subtelnych błędów.
Stephen Chung

208

Słowo ostrzeżenia, wszyscy programiści "use strict"wymagający dużej mocy : zastosowanie do istniejącego kodu może być niebezpieczne! To nie jest jakaś samoprzylepna, radosna naklejka, którą można uderzyć w kod, aby był „lepszy”. Wraz z "use strict"pragmą przeglądarka nagle wyrzuci wyjątki w przypadkowych miejscach, których nigdy wcześniej nie rzucała, tylko dlatego, że w tym miejscu robisz coś, co domyślnie / luźny JavaScript na szczęście pozwala, ale surowo go nie znosi! Możesz mieć naruszenia ścisłości, ukrywając się w rzadko używanych wywołaniach w kodzie, które rzucą wyjątek tylko wtedy, gdy w końcu zostaną uruchomione - powiedzmy, w środowisku produkcyjnym, z którego korzystają Twoi płatni klienci!

Jeśli masz zamiar się zanurzyć, dobrym pomysłem jest zastosowanie "use strict"wraz z kompleksowymi testami jednostkowymi i ściśle skonfigurowanym zadaniem kompilacji JSHint, które da ci pewność, że nie ma ciemnego rogu modułu, który wybuchłby okropnie tylko dlatego, że ty włączyłem tryb ścisły. Lub, hej, oto kolejna opcja: po prostu nie dodawaj "use strict"do żadnego ze starszych kodów, jest to prawdopodobnie bezpieczniejsze, szczerze mówiąc. OSTATECZNIE NIE dodawaj "use strict"do żadnych modułów, których nie posiadasz lub nie zarządzasz, takich jak moduły stron trzecich.

Myślę, że nawet jeśli jest to śmiertelnie zamknięte zwierzę w klatce, "use strict"może być dobre, ale musisz to zrobić dobrze. Najlepszym momentem na zachowanie surowości jest rozpoczęcie projektu od podstaw i rozpoczęcie od zera. Skonfiguruj JSHint/JSLintprzy użyciu wszystkich ostrzeżeń i opcji tak mocno, jak tylko Twój zespół jest w stanie znieść żołądek, uzyskaj dobry system budowania / testowania / potwierdzania Grunt+Karma+Chai, a dopiero potem zacznij oznaczać wszystkie nowe moduły jako "use strict". Przygotuj się na wyleczenie wielu drobnych błędów i ostrzeżeń. Upewnij się, że wszyscy rozumieją grawitację, konfigurując kompilację na FAIL, jeśli JSHint/JSLintspowoduje jakiekolwiek naruszenie.

Kiedy adoptowałem, mój projekt nie był projektem typu greenfield "use strict". W rezultacie moje IDE jest pełne czerwonych znaków, ponieważ nie mam "use strict"na połowie moich modułów, a JSHint narzeka na to. Przypomina mi o tym, jakie refaktoryzacje powinienem zrobić w przyszłości. Moim celem jest być wolnym od czerwonych znaków z powodu wszystkich moich brakujących "use strict"stwierdzeń, ale to już za wiele lat.


24
DLACZEGO devs w tym temacie są tak nonszalanckie w kwestii „stosować ścisłe”? WYRZUCA WYJĄTKI w skądinąd działającym JavaScript , na miłość boską ! Po prostu posyp go kodem jak cukier na płatkach kukurydzianych, co? NIE! ZŁY! „strict use” powinno być stosowane ostrożnie, najlepiej tylko w kontrolowanym kodzie, który ma testy jednostkowe, które przechodzą na wszystkich głównych przeglądarkach i które wykorzystują wszystkie ścieżki kodu. Masz testy? Ok, „ścisłe stosowanie” jest dla ciebie w porządku, wybij się.
DWoldrich

57
Tak. Oczywiście „użyj ścisłego” może złamać pozornie poprawny javascript, który wcześniej się nie złamał. Ale kod, który wcześniej się nie złamał, nie jest równoznaczny z poprawnością kodu i robieniem tego, co powinien. Zwykle odwoływanie się do niezadeklarowanych zmiennych sygnalizuje literówkę itp. Użycie strict pozwala uchwycić tego rodzaju błędy i, mam nadzieję, przed wysłaniem kodu produkcyjnego.
Jostein Kjønigsen

5
... lub po prostu zastosuj „użyj ścisłego” jako część ostatniego przejścia do swojego kodu, napraw wszystkie oczywiste problemy, wzrusz ramionami, powiedz „wystarczająco dobry”, a następnie wyjmij go na produkcję :)
Wolfie Inu

13
Osobiście nigdy / bardzo rzadko dodam "use strict"; do istniejącego kodu. Biorąc to pod uwagę, prawie zawsze będę go używać, gdy piszę nowy kod od zera
Martin

3
Jeśli już używasz JSLint, prawdopodobnie naprawiłeś większość miejsc, w których „użycie ścisłe” psuje wszystko.
Jonathan Cast

179

Użycie 'use strict';nie nagle poprawia kod.

Tryb ścisły JavaScript jest funkcją ECMAScript 5 . Możesz włączyć tryb ścisły, deklarując to w górnej części skryptu / funkcji.

'use strict';

Gdy silnik JavaScript zobaczy tę dyrektywę , zacznie interpretować kod w specjalnym trybie. W tym trybie błędy są zgłaszane, gdy zostaną wykryte pewne praktyki kodowania, które mogą być potencjalnymi błędami (co jest przyczyną trybu ścisłego).

Rozważ ten przykład:

var a = 365;
var b = 030;

Mając obsesję na punkcie wyrównywania literałów liczbowych, deweloper nieumyślnie zainicjował zmienną bliterał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.

Aby uzyskać niewyczerpującą listę specjalizacji w trybie ścisłym, zobacz tę odpowiedź .


Gdzie powinienem użyć 'use strict';?

  • W mojej nowej aplikacji JavaScript: Oczywiście! Tryb ścisły może być używany jako informator, gdy robisz coś głupiego ze swoim kodem.

  • W moim istniejącym kodzie JavaScript: Prawdopodobnie nie! Jeśli Twój istniejący kod JavaScript zawiera instrukcje, które są zabronione w trybie ścisłym, aplikacja po prostu się zepsuje. Jeśli chcesz mieć tryb ścisły, powinieneś być przygotowany na debugowanie i poprawianie istniejącego kodu. Dlatego użycie 'use strict';nagle nie poprawia kodu .


Jak korzystać z trybu ścisłego?

  1. Wstaw 'use strict';instrukcję na górze skryptu:

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....

    Pamiętaj, że wszystko w pliku myscript.jsbędzie interpretowane w trybie ścisłym.

  2. Lub wstaw 'use strict';instrukcję na górze swojej funkcji:

    function doSomething() {
        'use strict';
        ...
    }

    Wszystko w zakresie leksykalnym funkcji doSomethingbędzie interpretowane w trybie ścisłym. Ważne jest tutaj słowo zakres leksykalny . Na przykład, jeśli kod ścisły wywołuje funkcję biblioteki, która nie jest ścisła , tylko kod jest wykonywany w trybie ścisłym, a nie funkcja wywoływana. Zobacz tę odpowiedź, aby uzyskać lepsze wyjaśnienie.


Jakie rzeczy są zabronione w trybie ścisłym?

Znalazłem fajny artykuł opisujący kilka rzeczy, które są zabronione w trybie ścisłym (pamiętaj, że nie jest to lista wyłączna):

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ć newprefiks podczas wywoływania funkcji konstruktora, konstruktor thiszostanie 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ć thissię 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 0100oznacza 64, a nie 100, i 08jest 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 calleei caller właściwości. Umożliwia to przekazanie argumentskodu do niezaufanego kodu bez rezygnacji z poufnego kontekstu. Ponadto argumentswł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ć deletewłasnych zmiennych. Próba deletewłaściwości nieskonfigurowanej powoduje teraz wyjątek. Wartości pierwotne nie są niejawnie opakowane.


Słowa zastrzeżone dla przyszłych wersji JavaScript

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:

implements, interface, let, package, private, protected, public, static, Iyield


Dalsza lektura


2
to bardzo miłe wytłumaczenie. Mam jednak wątpliwości, czy mogę używać trybu „ścisłego” w połączeniu z innymi bibliotekami skryptów Java, takimi jak Angular js?
UVM,

3
@UVM: Dyrektywa trybu ścisłego wpływa tylko na zakres leksykalny. tzn. tylko zadeklarowany plik / funkcja. Jeśli masz inny plik / funkcję, która nie ma tej 'use strict'dyrektywy, zostaną one wykonane w trybie innym niż ścisły, nawet jeśli zostaną wywołane z funkcji działającej w trybie ścisłym. Zobacz ten asnwer o wyjaśnienia.
sampathsris,

To nie jest do końca poprawne. „use strict” zmienia sposób wykonywania kodu.
CyberEd

3
Przy drugim spojrzeniu masz rację. Myślałem, że miałeś na myśli tylko wyjątki, ale nie zmieniłeś sposobu działania kodu (jak zmiana this). Teraz widzę, że mówiłeś o wywołaniu innych funkcji.
CyberEd

3
W niektórych przypadkach użyteczne są ósemki. Składnia C jest z tego powodu okropna, ale chciałbym, aby języki dodawały nową składnię ósemkową, która mogłaby wówczas pozwolić na wycofanie formy wiodącej zera. Oczywiście, aby Javascript obsługiwał formę wiodącą zero, było po prostu głupie.
supercat

138

Zdecydowanie polecam każdemu programistowi, aby zaczął teraz używać trybu ścisłego. Obsługuje go wystarczająca liczba przeglądarek, aby tryb ścisły słusznie uchronił nas przed błędami, o których nawet nie wiedzieliśmy, że są w twoim kodzie.

Najwyraźniej na początkowym etapie wystąpią błędy, których nigdy wcześniej nie napotkaliśmy. Aby uzyskać pełną korzyść, musimy przejść odpowiednie testy po przejściu do trybu ścisłego, aby upewnić się, że wszystko złapaliśmy. Zdecydowanie nie tylko wrzucamy use strictnaszego kodu i zakładamy, że nie ma błędów. Tak więc rezygnacja jest taka, że ​​nadszedł czas, aby zacząć używać tej niezwykle przydatnej funkcji języka do pisania lepszego kodu.

Na przykład,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint to debugger napisany przez Douglasa Crockforda. Wystarczy wkleić skrypt, a on szybko przeszuka wszelkie zauważalne problemy i błędy w kodzie.


6
@JamieHutber: Proszę odwiedzić ten link caniuse.com/use-strict ORAZ kangax.github.io/es5-compat-table . To da dokładny pomysł dla wszystkich przeglądarek.
Pank

95

Chciałbym zaoferować nieco bardziej uzasadnioną odpowiedź uzupełniającą inne odpowiedzi. Miałem nadzieję na edycję najpopularniejszej odpowiedzi, ale mi się nie udało. Starałem się, aby było to jak najbardziej wyczerpujące i kompletne.

Więcej informacji można znaleźć w dokumentacji MDN .

"use strict" dyrektywa wprowadzona w ECMAScript 5.

Dyrektywy są podobne do oświadczeń, ale różne.

  • use strictnie zawiera słów kluczowych: Dyrektywa jest prostym wyrażeniem wyrażającym, które składa się ze specjalnego literału ciągowego (w pojedynczym lub podwójnym cudzysłowie). Silniki JavaScript, które nie implementują ECMAScript 5, widzą jedynie wyrażenie wyrażeniowe bez skutków ubocznych. Oczekuje się, że przyszłe wersje standardów ECMAScript wprowadzą usejako prawdziwe słowo kluczowe; cytaty stałyby się w ten sposób przestarzałe.
  • use strictmoże być użyte tylko na początku skryptu lub funkcji, tzn. musi poprzedzać każdą inną (rzeczywistą) instrukcję. Nie musi to być pierwsza instrukcja w skrypcie funkcji: może być poprzedzona innymi wyrażeniami instrukcji składającymi się z literałów łańcuchowych (a implementacje JavaScript mogą traktować je jako dyrektywy specyficzne dla implementacji). Instrukcje literałów łańcuchowych, które następują po pierwszej instrukcji rzeczywistej (w skrypcie lub funkcji) są prostymi instrukcjami wyrażeń. Tłumacze nie mogą interpretować ich jako dyrektyw i nie mają one żadnego skutku.

use strictDyrektywa wskazuje, że kod następująco (w skrypcie lub funkcja) jest ścisły kod. Kod na najwyższym poziomie skryptu (kod, który nie znajduje się w funkcji) jest uważany za kod ścisły, gdy skrypt zawiera use strictdyrektywę. Treść funkcji jest uważana za ścisły kod, gdy sama funkcja jest zdefiniowana w ścisłym kodzie lub gdy funkcja zawiera use strictdyrektywę. Kod przekazywany do eval()metody jest uważany za kod ścisły, gdy eval()został wywołany ze ścisłego kodu lub zawiera use strictsamą dyrektywę.

Tryb ścisły ECMAScript 5 jest ograniczonym podzbiorem języka JavaScript, który eliminuje istotne deficyty języka i oferuje bardziej rygorystyczne sprawdzanie błędów i większe bezpieczeństwo. Poniżej wymieniono różnice między trybem ścisłym a trybem normalnym (z których pierwsze trzy są szczególnie ważne):

  • Nie można używać opcji with-statement w trybie ścisłym.
  • W trybie ścisłym wszystkie zmienne muszą być zadeklarowane: jeśli przypiszesz wartość do identyfikatora, który nie został zadeklarowany jako zmienna, funkcja, parametr funkcji, parametr klauzuli catch lub właściwość globalna Object, otrzymasz wartość ReferenceError. W trybie normalnym identyfikator jest domyślnie zadeklarowany jako zmienna globalna (jako właściwość globalnej Object)
  • W trybie ścisłym słowo kluczowe thisma wartość undefinedw funkcjach, które zostały wywołane jako funkcje (a nie jako metody). (W trybie normalnym thiszawsze wskazuje globalny Object). Tej różnicy można użyć do przetestowania, czy implementacja obsługuje tryb ścisły:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Również gdy funkcja jest wywoływana w trybie ścisłym call()lub applyw trybie ścisłym, wówczas thisjest to dokładnie wartość pierwszego argumentu call()lub apply()wywołania. (W trybie normalnym nulli undefinedsą zastępowane przez globalne, Objecta wartości, które nie są obiektami, są rzutowane na obiekty).

  • W trybie ścisłym otrzymasz TypeError, gdy spróbujesz przypisać właściwości tylko do odczytu lub zdefiniować nowe właściwości dla obiektu nierozszerzalnego. (W trybie normalnym oba po prostu kończą się niepowodzeniem bez komunikatu o błędzie).

  • W trybie ścisłym podczas przekazywania kodu eval()nie można deklarować ani definiować zmiennych lub funkcji w zakresie wywołującego (jak można to zrobić w trybie normalnym). Zamiast tego tworzony jest nowy zakres, eval()a zmienne i funkcje mieszczą się w tym zakresie. Ten zakres jest niszczony po eval()zakończeniu wykonywania.
  • W trybie ścisłym argument-obiekt funkcji zawiera statyczną kopię wartości, które są przekazywane do tej funkcji. W trybie normalnym argument-obiekt ma nieco „magiczne” zachowanie: elementy tablicy i parametry funkcji o podanej nazwie odnoszą się do tej samej wartości.
  • W trybie ścisłym otrzymasz, SyntaxErrorgdy za deleteoperatorem pojawi się niekwalifikowany identyfikator (zmienna, funkcja lub parametr funkcji). W trybie normalnym deletewyrażenie nic nie robi i jest oceniane false.
  • W trybie ścisłym otrzymasz, TypeErrorgdy spróbujesz usunąć nieskonfigurowalną właściwość. (W trybie normalnym próba po prostu kończy się niepowodzeniem, a deletewyrażenie jest oceniane na false).
  • W trybie ścisłym jest to błąd składniowy, gdy próbujesz zdefiniować kilka właściwości o tej samej nazwie dla literału obiektu. (W trybie normalnym nie ma błędu.)
  • W trybie ścisłym uważa się go za błąd składniowy, gdy deklaracja funkcji ma wiele parametrów o tej samej nazwie. (W trybie normalnym nie ma błędu.)
  • W trybie ścisłym literały ósemkowe nie są dozwolone (są to literały rozpoczynające się od 0x. (W trybie normalnym niektóre implementacje dopuszczają literały ósemkowe).
  • W trybie ścisłym identyfikatory evali argumentssą traktowane jak słowa kluczowe. Nie możesz zmienić ich wartości, nie możesz przypisać im wartości i nie możesz używać ich jako nazw zmiennych, funkcji, parametrów funkcji lub identyfikatorów bloku catch.
  • W trybie ścisłym istnieją dodatkowe ograniczenia możliwości sprawdzenia stosu wywołań. arguments.calleri arguments.calleepowodują TypeErrorfunkcję w trybie ścisłym. Ponadto niektóre właściwości funkcji wywołującej i argumentów funkcji w trybie ścisłym powodują, TypeErrorgdy próbujesz je odczytać.

4
„W trybie ścisłym literały ósemkowe są niedozwolone (są to literały rozpoczynające się od 0x ...)” Literały ósemkowe zaczynają się od wiodącej 0.
Alex Gittemeier,

83

Moje dwa centy:

Jednym z celów trybu ścisłego jest umożliwienie szybszego debugowania problemów. Pomaga deweloperom, zgłaszając wyjątek, gdy wystąpią pewne złe rzeczy, które mogą powodować ciche i dziwne zachowanie strony. W momencie, gdy skorzystamy use strict, kod wyrzuci błędy, które pomogą programistom naprawić go z wyprzedzeniem.

Kilka ważnych rzeczy, których nauczyłem się po użyciu use strict:

Zapobiega globalnej deklaracji zmiennych:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Teraz ten kod tworzy nameoftreew zasięgu globalnym, do którego można uzyskać dostęp za pomocą window.nameoftree. Po wdrożeniu use strictkod generowałby błąd.

Uncaught ReferenceError: nameoftree nie jest zdefiniowany

Sample

Eliminuje withstwierdzenie:

withinstrukcji nie można zminimalizować za pomocą narzędzi takich jak uglify-js . Są również przestarzałe i usuwane z przyszłych wersji JavaScript.

Sample

Zapobiega duplikatom:

Kiedy mamy zduplikowaną właściwość, zgłasza wyjątek

Uncaught SyntaxError: Zduplikowana właściwość danych w dosłowności obiektu jest niedozwolona w trybie ścisłym

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Jest jeszcze kilka, ale muszę zdobyć więcej wiedzy na ten temat.


W ECMAScript 2015 duplikaty nazw właściwości są znów dozwolone! Zobacz dokumentację MDN .
philmcole

62

Jeśli korzystasz z przeglądarki wydanej w ubiegłym roku, najprawdopodobniej obsługuje tryb JavaScript Strict. Tylko starsze przeglądarki, zanim ECMAScript 5 stał się obecnym standardem, nie obsługują go.

Cytaty wokół polecenia upewniają się, że kod będzie nadal działał również w starszych przeglądarkach (chociaż rzeczy, które generują błąd składniowy w trybie ścisłym, ogólnie po prostu powodują nieprawidłowe działanie skryptu w trudny do wykrycia sposób w starszych przeglądarkach).


12
Więc co to robi?
Anish Gupta,

7
... opisuje to częściowo zgodność, ale nie to, co faktycznie robi.
courtimas

58

Podczas dodawania "use strict";następujące przypadki wygenerują błąd SyntaxError przed uruchomieniem skryptu:

  • Torując drogę dla przyszłych wersjach ECMAScript , korzystając z jednej z nowo zastrzeżonych słów kluczowych (na przewidywania dla ECMAScript 6 ): implements, interface, let, package, private, protected, public, static, i yield.

  • Deklarowanie funkcji w blokach

    if(a<b){ function f(){} }
  • Składnia ósemkowa

    var n = 023;
  • this wskaż obiekt globalny.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
  • Deklarowanie dwukrotnie tej samej nazwy dla nazwy właściwości w literale obiektu

     {a: 1, b: 3, a: 7} 

    Tak już nie jest w ECMAScript 6 ( błąd 1041128 ).

  • Deklarowanie dwóch argumentów funkcji z tą samą nazwą funkcji

    f(a, b, b){}
  • Ustawienie wartości dla niezadeklarowanej zmiennej

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
  • Używanie deletenazwy zmiennejdelete myVariable;

  • Użycie evallub argumentsjako nazwy argumentu zmiennej lub funkcji

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 

Źródła:


W ECMAScript 2015 duplikaty nazw właściwości są znów dozwolone! Zobacz dokumentację MDN .
philmcole

53

Tryb ścisły wprowadza kilka zmian w normalnej semantyce JavaScript:

  • eliminuje niektóre ciche błędy JavaScript, zmieniając je w celu zgłaszania błędów.

  • naprawia błędy, które utrudniają silnikom JavaScript wykonywanie optymalizacji.

  • zabrania definiowania składni w przyszłych wersjach ECMAScript.

Aby uzyskać więcej informacji, odwiedź Strict Mode- Javascript


52

„Użyj ścisłego”; to ubezpieczenie, że programista nie będzie korzystał z luźnych lub złych właściwości JavaScript. Jest to przewodnik, podobnie jak linijka pomoże ci tworzyć proste linie. „Use Strict” pomoże ci wykonać „Proste kodowanie”.

Ci, którzy wolą nie używać linijek do prostowania linii, zwykle kończą na tych stronach, prosząc innych o debugowanie kodu.

Uwierz mi. Narzut jest pomijalny w porównaniu do źle zaprojektowanego kodu. Doug Crockford, który od kilku lat jest starszym programistą JavaScript, ma tutaj bardzo interesujący post . Osobiście lubię cały czas wracać na jego stronę, aby upewnić się, że nie zapomnę mojej dobrej praktyki.

Współczesna praktyka JavaScript powinna zawsze wywoływać „Use Strict”; pragma. Jedynym powodem, dla którego grupa ECMA zdecydowała się na opcjonalny tryb „ścisły”, jest umożliwienie mniej doświadczonym programistom dostępu do JavaScript i dać czas na dostosowanie się do nowych i bezpieczniejszych praktyk kodowania.


66
Powód, dla którego tryb ścisły jest opcjonalny, nie ma nic wspólnego z tym, co powiedziałeś. Prawdziwym powodem jest niełamanie istniejącego kodu, który może nie być zgodny .
Dexygen

17
Rzeczywiście, mniej doświadczeni koderzy powinni być pierwszymi , którzy umożliwią „użycie ścisłe”;
Antti Haapala,

46

Dołączenie use strictna początku wszystkich wrażliwych plików JavaScript od tego momentu jest małym sposobem na bycie lepszym programistą JavaScript i unikanie losowych zmiennych, które stają się globalne i rzeczy zmieniają się cicho.


42

Cytowanie z w3schools :

Dyrektywa „stosować ściśle”

Dyrektywa „use strict” jest nowa w JavaScript 1.8.5 (ECMAScript wersja 5).

To nie jest stwierdzenie, ale dosłowne wyrażenie, ignorowane przez wcześniejsze wersje JavaScript.

Celem „use strict” jest wskazanie, że kod powinien być wykonywany w „trybie ścisłym”.

W trybie ścisłym nie można na przykład używać niezadeklarowanych zmiennych.

Dlaczego tryb ścisły?

Tryb ścisły ułatwia pisanie „bezpiecznego” JavaScript.

Tryb ścisły zmienia zaakceptowaną wcześniej „złą składnię” na rzeczywiste błędy.

Na przykład, w normalnym JavaScript, błędne wpisanie nazwy zmiennej tworzy nową zmienną globalną. W trybie ścisłym spowoduje to zgłoszenie błędu, uniemożliwiając przypadkowe utworzenie zmiennej globalnej.

W normalnym JavaScript programista nie otrzyma żadnej informacji zwrotnej o błędzie przypisującej wartości do właściwości, których nie można zapisać.

W trybie ścisłym każde przypisanie do właściwości, której nie można zapisać, właściwości tylko pobierającej, nieistniejącej właściwości, nieistniejącej zmiennej lub nieistniejącego obiektu spowoduje wygenerowanie błędu.

Proszę odnieść się do http://www.w3schools.com/js/js_strict.asp wiedzieć więcej


37

"use strict"sprawia, że ​​kod JavaScript działa w trybie ścisłym , co w zasadzie oznacza, że ​​wszystko musi zostać zdefiniowane przed użyciem. Głównym powodem używania trybu ścisłego jest unikanie przypadkowego globalnego użycia niezdefiniowanych metod.

Również w trybie ścisłym rzeczy działają szybciej, niektóre ostrzeżenia lub ciche ostrzeżenia generują krytyczne błędy, lepiej zawsze używać go do tworzenia ładniejszego kodu.

"use strict"jest powszechnie potrzebny do użycia w ECMA5, w ECMA6 domyślnie jest częścią JavaScript , więc nie trzeba go dodawać, jeśli używasz ES6.

Spójrz na te instrukcje i przykłady z MDN:

Dyrektywa „ściśle przestrzegaj” Dyrektywa
„ściśle przestrzegaj” jest nowością w JavaScript 1.8.5 (ECMAScript wersja 5). To nie jest stwierdzenie, ale dosłowne wyrażenie, ignorowane przez wcześniejsze wersje JavaScript. Celem „use strict” jest wskazanie, że kod powinien być wykonywany w „trybie ścisłym”. W trybie ścisłym nie można na przykład używać niezadeklarowanych zmiennych.

Przykłady użycia „use strict”:
Tryb ścisły dla funkcji: Podobnie, aby wywołać tryb ścisły dla funkcji, wpisz dokładną instrukcję „use strict”; (lub „use strict”;) w ciele funkcji przed innymi wyrażeniami.

1) tryb ścisły w funkcjach

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) tryb ścisły całego skryptu

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Przypisanie do nie zapisywalnej globalnej

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Możesz przeczytać więcej na MDN .


31

Niektórzy ludzie z komisji ECMAScript dobrze mówią: Zmiany w JavaScript, część 1: ECMAScript 5 " o tym, jak stopniowe użycie "use strict"przełącznika pozwala implementatorom JavaScript na usunięcie wielu niebezpiecznych funkcji JavaScript bez gwałtownego niszczenia każdej strony internetowej na świecie.

Oczywiście mówi również o tym, ile jest tych błędów i jakie są błędy ECMAScript 5.


27

Małe przykłady do porównania:

Tryb nie ścisły:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

Tryb ścisły:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Tryb nie ścisły:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true


2
Zauważ, że powyższy kod doda zmienną i do globalnego zakresu (generalnie nie jest to najlepsza praktyka i tryb ścisły pomaga tego uniknąć).
Michael

1
Czy ktoś może wyjaśnić drugi przykład? Nie rozumiem Czy nie powinno być this === 'a'w obu przykładach?
MaximeW

19

Zauważ, że use strictzostał wprowadzony w EcmaScript 5 i od tego czasu był przechowywany.

Poniżej przedstawiono warunki do uruchomienia trybu ścisłego w ES6 i ES7 :

  • Kod globalny jest kodem trybu ścisłego, jeśli zaczyna się od Prologu Dyrektywy, który zawiera dyrektywę dotyczącą ścisłego użycia (patrz 14.1.1).
  • Kod modułu jest zawsze kodem trybu ścisłego.
  • Wszystkie części deklaracji klasy lub wyrażenia klasy są kodem trybu ścisłego.
  • Kod ewaluacyjny jest kodem trybu ścisłego, jeśli zaczyna się od Prologu Dyrektywy, który zawiera dyrektywę ścisłego użycia lub jeśli wezwanie do ewaluacji jest ewaluacją bezpośrednią (patrz 12.3.4.1) zawartą w kodzie trybu ścisłego.
  • Kod funkcji jest kodem trybu ścisłego, jeśli skojarzona funkcja: deklaracja funkcji, funkcja który zawiera dyrektywę o ścisłym użyciu.
  • Kod funkcji dostarczany jako argumenty do wbudowanych konstruktorów funkcji i generatora jest kodem trybu ścisłego, jeśli ostatnim argumentem jest ciąg znaków, który po przetworzeniu jest obiektem FunctionBody rozpoczynającym się od Prologu dyrektywy zawierającego dyrektywę ścisłego użycia.

14

Głównymi powodami, dla których programiści powinni używać, "use strict"są:

  1. Zapobiega przypadkowej deklaracji zmiennych globalnych . Użycie "use strict()"zapewni, że zmienne zostaną zadeklarowane varprzed użyciem. Na przykład:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
  2. Uwaga: "use strict"Dyrektywa jest rozpoznawana tylko na początku skryptu lub funkcji.
  3. Ciąg "arguments"nie może być użyty jako zmienna:

    "use strict";
    var arguments = 3.14;    // This will cause an error
  4. Ograniczy użycie słów kluczowych jako zmiennych. Próba ich użycia spowoduje zgłoszenie błędów.

W skrócie sprawi, że Twój kod będzie mniej podatny na błędy, a z kolei sprawi, że napiszesz dobry kod.

Więcej informacji na ten temat można znaleźć tutaj .


12

„użyj ścisłego”; to wysiłek ECMA, aby JavaScript był nieco bardziej niezawodny. Wprowadza w JS próbę uczynienia go co najmniej trochę „surowym” (inne języki wdrażają surowe reguły od lat 90.). W rzeczywistości „zmusza” programistów JavaScript do postępowania zgodnie z najlepszymi praktykami kodowania. Mimo to JavaScript jest bardzo delikatny. Nie ma czegoś takiego jak zmienne wpisywane, metody wpisywane itp. Zdecydowanie polecam programistom JavaScript nauczyć się bardziej niezawodnego języka, takiego jak Java lub ActionScript3, i wdrożyć te same najlepsze praktyki w kodzie JavaScript, będzie on działał lepiej i łatwiej odpluskwić.


12

Tryb „ścisły” JavaScript został wprowadzony w ECMAScript 5.

(function() {
  "use strict";
  your code...
})();

Pisanie "use strict";u góry pliku JS włącza ścisłe sprawdzanie składni. Wykonuje dla nas następujące zadania:

  1. pokazuje błąd, jeśli próbujesz przypisać do niezadeklarowanej zmiennej

  2. powstrzymuje Cię przed nadpisywaniem kluczowych bibliotek systemowych JS

  3. zabrania niektórych niebezpiecznych lub podatnych na błędy funkcji językowych

use strictdziała również wewnątrz poszczególnych funkcji. Zawsze lepiej jest włączyć use strictdo swojego kodu.

Problem ze zgodnością przeglądarki: dyrektywy „use” mają być kompatybilne wstecz. Przeglądarki, które ich nie obsługują, zobaczą dosłowny ciąg znaków, do którego nie ma dalszych odniesień. Więc przejdą nad nią i przejdą dalej.


12

use strictto sposób na zwiększenie bezpieczeństwa kodu, ponieważ nie można używać niebezpiecznych funkcji, które mogą nie działać zgodnie z oczekiwaniami. Jak napisano wcześniej, kod jest bardziej rygorystyczny.


11

Opcja Użyj ścisłego służy do wyświetlania typowych i powtarzających się błędów, dzięki czemu jest obsługiwana inaczej i zmienia sposób działania skryptu Java, takie zmiany to:

  • Zapobiega przypadkowym globaliom

  • Bez duplikatów

  • Eliminuje za pomocą

  • Eliminuje ten przymus

  • Bezpieczniejsza ewaluacja ()

  • Błędy dla niezmiennych

możesz również przeczytać ten artykuł, aby uzyskać szczegółowe informacje


11

Zwykle JavaScript nie przestrzega surowych zasad, co zwiększa szanse na błędy. Po użyciu "use strict"kod JavaScript powinien przestrzegać ścisłego zestawu zasad, podobnie jak w innych językach programowania, takich jak użycie terminatorów, deklaracja przed inicjalizacją itp.

Jeśli "use strict"zostanie użyty, kod powinien zostać napisany zgodnie z ścisłym zestawem reguł, zmniejszając w ten sposób ryzyko błędów i dwuznaczności.


7

„użyj ścisłego”; Określa, że ​​kod JavaScript powinien być wykonywany w „trybie ścisłym”.

  • Dyrektywa „ściśle przestrzegaj” była nowa w ECMAScript w wersji 5.
  • To nie jest stwierdzenie, ale dosłowne wyrażenie, ignorowane przez wcześniejsze wersje JavaScript.
  • Celem „use strict” jest wskazanie, że kod powinien być wykonywany w „trybie ścisłym”.
  • W trybie ścisłym nie można na przykład używać niezadeklarowanych zmiennych.

Wszystkie nowoczesne przeglądarki obsługują „używaj ścisłego” oprócz Internet Explorera 9 i niższych wersji .

Niekorzyść

Jeśli programista użył biblioteki, która była w trybie ścisłym, ale był przyzwyczajony do pracy w trybie normalnym, może wywołać pewne działania w bibliotece, które nie działałyby zgodnie z oczekiwaniami.

Co gorsza, ponieważ programista jest w trybie normalnym, nie mają one zalet zgłaszania dodatkowych błędów, więc błąd może zawieść cicho.

Jak wspomniano powyżej, tryb ścisły powstrzymuje cię od robienia pewnych rzeczy.

Ludzie ogólnie myślą, że nie powinieneś używać tych rzeczy w pierwszej kolejności, ale niektórzy programiści nie lubią tego ograniczenia i chcą korzystać ze wszystkich funkcji języka.


4

Tryb ścisły może zapobiec wyciekom pamięci.

Sprawdź poniższą funkcję napisaną w trybie innym niż ścisły:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

W tej funkcji używamy zmiennej wywoływanej namewewnątrz funkcji. Wewnętrznie kompilator najpierw sprawdzi, czy w danym zakresie funkcji zadeklarowana jest jakaś zmienna o tej nazwie. Ponieważ kompilator zrozumiał, że nie ma takiej zmiennej, sprawdzi w zakresie zewnętrznym. W naszym przypadku jest to zasięg globalny. Znów kompilator zrozumiał, że nie ma również zadeklarowanej zmiennej w przestrzeni globalnej o tej nazwie, więc tworzy dla nas taką zmienną w przestrzeni globalnej. Koncepcyjnie ta zmienna zostanie utworzona w zasięgu globalnym i będzie dostępna w całej aplikacji.

Innym scenariuszem jest, powiedzmy, zmienna zadeklarowana w funkcji potomnej. W takim przypadku kompilator sprawdza poprawność tej zmiennej w zakresie zewnętrznym, tj. Funkcji nadrzędnej. Tylko wtedy sprawdzi globalną przestrzeń i stworzy dla nas zmienną. Oznacza to, że należy wykonać dodatkowe kontrole. Wpłynie to na wydajność aplikacji.


Teraz napiszmy tę samą funkcję w trybie ścisłym.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

Otrzymamy następujący błąd.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

Tutaj kompilator zgłasza błąd odniesienia. W trybie ścisłym kompilator nie pozwala nam używać zmiennej bez jej deklarowania. W ten sposób można zapobiec wyciekom pamięci. Ponadto możemy pisać bardziej zoptymalizowany kod.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.