Pytanie Co robi "używać ścisłego" w JavaScript i jakie jest jego uzasadnienie?


Niedawno uruchomiłem niektóre z mojego kodu JavaScript przez Crockford's JSLinti spowodował następujący błąd:

Problem w wierszu 1, znak 1: Brakujące wyrażenie "użyj ścisłego".

Poszukując trochę, zdałem sobie sprawę, że niektórzy dodają "use strict"; do ich kodu JavaScript. Po dodaniu instrukcji błąd przestał się pojawiać. Niestety, Google nie ujawniło zbyt wiele historii tej instrukcji. Z pewnością musi mieć coś wspólnego z interpretacją JavaScript przez przeglądarkę, ale nie mam pojęcia, jaki byłby efekt.

Więc co jest "use strict"; wszystko na temat, co to oznacza, i czy nadal jest istotne?

Czy którekolwiek z obecnych przeglądarek odpowiadają na "use strict"; ciąg znaków czy jest to do wykorzystania w przyszłości?


6712
2017-08-26 16:10


pochodzenie




Odpowiedzi:


Ten artykuł na temat Strictowego trybu Javascript może Cię zainteresować: John Resig - Tryb ścisły ECMAScript 5, JSON i inne

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

Tryb ścisły to nowa funkcja w ECMAScript 5, która umożliwia umieszczenie programu lub funkcji w "ścisłym" kontekście operacyjnym. Ten ścisły kontekst zapobiega podejmowaniu niektórych działań i generuje więcej wyjątków.

I:

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

  • Łapie niektóre typowe wpadki kodujące, rzucając wyjątki.
  • Zapobiega lub wyrzuca błędy, gdy podejmowane są względnie "niebezpieczne" działania (takie jak uzyskanie dostępu do obiektu globalnego).
  • Wyłącza funkcje, które są mylące lub źle przemyślane.

Zauważ, że możesz zastosować "tryb ścisły" do całego pliku ... Lub możesz go użyć tylko dla określonej funkcji (wciąż cytuje z artykułu Johna Resiga):

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

Które mogą być pomocne, jeśli musisz wymieszać stary i nowy kod ;-)

Tak, przypuszczam, że to trochę jak "use strict" możesz użyć w Perlu (stąd nazwa?): pomaga zmniejszyć liczbę błędów, wykrywając więcej rzeczy, które mogą prowadzić do pęknięć.

Obecnie jest obsługiwane przez wszystkie główne przeglądarki  (pasek IE 9 i poniżej).


4399
2017-08-26 16:15



Zmieniasz domyślność po tylu latach? Za późno na to: zepsułoby to tak wiele istniejących stron / skryptów / aplikacji ... Jedyną możliwą rzeczą jest pomóc poprawić sytuację na przyszłość. - Pascal MARTIN
Wypróbowałem mały fragment kodu, który byłby nieprawidłowy podczas używania "use strict" w Firefoksie 3.6, Safari 5, Chrome 7 i Opera 10.6 (wszystkie komputery Mac). Nie ma żadnych błędów, więc myślę, że "use strict" nie jest jeszcze obsługiwane w żadnej przeglądarce. Nie testowałem jednak w IE9;) - Husky
Szybka aktualizacja: Firefox 4 ma pełną obsługę trybu ścisłego i, o ile wiem, nie działa żadna inna przeglądarka. Safari i Chrome mają "częściowe" wsparcie, ale tak naprawdę nie wiem, co to oznacza. - Sasha Chedygov
Wydaje się, że Chrome 11 spełnia wszystkie te testy, podobnie jak IE10 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html# - gman
@Julius - To nie mogło zostać zaimplementowane przy użyciu zastrzeżonego słowa kluczowego, ponieważ wtedy kod próbujący uruchomić tryb ścisły zostałby złamany w starych przeglądarkach. Dodanie "losowego" ciągu literalnego niczego nie psuje. - nnnnnn


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

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

"use strict";

Umieszczenie go w swoim kodzie nie powinno powodować problemów z bieżącymi przeglądarkami, ponieważ jest to tylko ciąg znaków. Może to spowodować problemy z twoim kodem w przyszłości, jeśli twój kod narusza pragmę. Na przykład, jeśli obecnie masz foo = "bar" bez definiowania foo po pierwsze, twój kod zacznie się nie udawać ... co jest dobre w mojej opinii.


1103
2017-08-26 16:14



Usterka szybko i nie powiedzie się głośno. - Niels Bom
Jeśli piszesz Javascript inline w plikach HTML, uruchom każdy nowy blok za pomocą <script>"use strict";. Flaga ma zastosowanie tylko do bloku, w którym jest zawarty. - nobar
To zabawne, w wyniku tego ciągi muszą mieć pojedyncze cytaty. To pisz 'use strict'; zamiast - nilsi
co by się stało z koncepcją podnośnika javascript? - Sunil Sharma
@SunilSharma Jeśli spróbujesz podnieść, ale zawiedzie, ponieważ zmienna nie jest zdefiniowana, w tej chwili doda ją do obiektu globalnego. Z "use strict";zamiast tego zawiedzie. Ma to więcej sensu, ponieważ jeśli dodaje to do globalnego obiektu, oznacza to, że może nie zadziałać przy następnym uruchomieniu funkcji / zrobić coś innego, co zresetuje blok, ponieważ będzie to najwyższy blok (globalny). - wizzwizz4


Twierdzenie "use strict"; instruuje przeglądarkę, aby używała trybu ścisłego, który jest zredukowanym i bezpieczniejszym zestawem funkcji JavaScript.

Lista funkcji (niewyczerpująca)

  1. Dezaktywuje zmienne globalne. (Brakujące połowy var deklaracje i literówki w nazwach zmiennych)

  2. Niewłaściwe przypisania błędów spowodują błąd w trybie ścisłym (przypisywanie NaN = 5;)

  3. Próby usunięcia nie dających się usunąć właściwości rzuci (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 ósemkowej składni (var x = 023; niektórzy deweloperzy zakładają błędnie, że poprzednie zero nie zmienia niczego.)

  7. Zabrania with słowo kluczowe

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

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

  10. Zabrania wiązania lub przypisywania nazw eval i arguments w każdej formie

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

  12. arguments.callee nie jest wspierany

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


519
2017-11-24 21:22



Nit: zmienne globalne są dozwolone, muszą być jawne (np. window.foo = bar). - gcampbell
Wymaga, aby wszystkie nazwy właściwości w literale obiektu były unikalne (var x = {x1: "1", x1: "2"}). - Arun Killu
W twoim przykładzie z 11 brakuje modyfikacji a (w przeciwnym wypadku nie ma sensu). I. e. funkcja suma (a, b) {a = 0; zwracane 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
właśnie uratowałeś mi kilka godzin debugowania za pomocą numeru 6 - jazzcat


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

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

Mówi o obsłudze przeglądarki, ale co ważniejsze, jak sobie z nią radzić w bezpieczny sposób:

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.
*/

369
2017-07-15 23:25



Nie zgadzam się. Myślę, że to pokazuje, dlaczego jest to bardzo przydatne. W gruncie rzeczy oznacza to, że to zwraca swoją funkcję, a nie window - Jamie Hutber
kiedy kiedykolwiek chcesz mieć okno? this z którymi nie możesz celować window? - Jamie Hutber
Odnosi się do siebie. this należy do własnej funkcji, a nie do okna globalnego - Jamie Hutber
W drugim this jeden jest rzeczywiście undefined. - Broxzier
Chodzi o to, że twój program JS zacznie się zawieść z powodu dostępu do właściwości nieokreślonej, zamiast cichego robienia niewłaściwej rzeczy na obiekcie globalnym. Sprawia, że ​​wyszukiwanie subtelnych błędów jest łatwiejsze. - Stephen Chung


Jedna uwaga, wszyscy ciężko pracujący programiści: aplikujący "use strict" do istniejącego kodu może być niebezpieczne! To nie jest jakaś naklejka z dobrego samopoczucia i radosnej twarzy, którą można uderzyć w kod, aby była "lepsza". Dzięki "use strict" pragma, przeglądarka nagle wyrzuci wyjątki w przypadkowych miejscach, których nigdy wcześniej nie wyrzucała, tylko dlatego, że w tym miejscu robisz coś, co domyślnie / luźno JavaScript dopuszcza, ale bezwzględnie ignoruje JavaScript! Możesz mieć naruszenia ścisłości ukrywające się w rzadko używanych wywołaniach w kodzie, które rzucają wyjątek tylko wtedy, gdy w końcu zostaną uruchomione - na przykład w środowisku produkcyjnym, z którego korzystają klienci płacący!

Jeśli chcesz się zanurzyć, dobrze jest się zgłosić "use strict" oprócz kompleksowych testów jednostkowych i ściśle skonfigurowanego zadania budowania JSHint, które da ci pewność, że nie ma ciemnego kąta twojego modułu, który wysadzi się okropnie tylko dlatego, że włączyłeś tryb ścisły. Albo, hej, oto kolejna opcja: po prostu nie dodawaj "use strict" do każdego ze starszego kodu, to pewnie bezpieczniej w ten sposób, szczerze. ZDECYDOWANIE NIE Dodaj "use strict" do modułów, których nie masz ani nie przechowujesz, takich jak moduły stron trzecich.

Myślę, że mimo iż jest to zwierzę w klatce, "use strict" może być dobrym materiałem, ale musisz to zrobić dobrze. Najlepszym momentem na ścisłe przestrzeganie jest sytuacja, gdy projekt jest od podstaw i zaczynasz od zera. Skonfiguruj JSHint/JSLint ze wszystkimi ostrzeżeniami i opcjami, które są tak napięte, jak twój zespół może znieść żołądek, uzyskać dobry build / test / aserse du jour rigged Grunt+Karma+Chai, i tylko THEN zacznie oznaczać wszystkie twoje nowe moduły jako "use strict". Przygotuj się na leczenie wielu brzydkich błędów i ostrzeżeń. Upewnij się, że wszyscy rozumieją grawitację, konfigurując kompilację na FAIL if JSHint/JSLintpowoduje jakiekolwiek naruszenia.

Mój projekt nie był projektem typu greenfield po przyjęciu "use strict". W rezultacie moje IDE jest pełne czerwonych znaków, ponieważ nie mam "use strict" na połowę moich modułów, a JSHint narzeka na to. Jest to dla mnie przypomnienie o tym, co powinienem zrobić w przyszłości. Moim celem jest bycie wolnym od czerwonych znaków ze względu na brakujące osoby "use strict" oświadczenia, ale to już za wiele lat.


182
2018-03-03 07:37



DLACZEGO w tym wątku są deweloperzy tak kawalerscy o "użyciu ścisłym" ?? OTRZYMUJE WYJĄTKI w w przeciwnym razie działa JavaScriptdla dobra dobra! Po prostu posyp je na kod jak cukier na płatkach kukurydzianych, co? NIE! ZŁY! "use strict" powinno być używane ostrożnie, najlepiej tylko w kodzie, który kontrolujesz, który ma testy jednostkowe, które przechodzą przeciwko wszystkim głównym przeglądarkom i które wykonują wszystkie ścieżki kodu. Masz testy? Dobrze, "użyj ścisłego" jest dla ciebie dobre, pukajcie. - DWoldrich
Tak. Oczywiście "użyj ścisłego" może złamać pozornie prawidłowy javascript, który nie pękł wcześniej. Ale kod, który nie został złamany wcześniej, nie jest równy poprawnemu kodowi i robi to, co powinien. Zwykle odwoływanie się do niezadeklarowanych zmiennych sygnalizuje literówkę, itp. Użyj ścisłej pozwala złapać tego rodzaju błędy, i mam nadzieję, że przed wysłaniem kodu produkcyjnego. - Jostein Kjønigsen
... lub po prostu zastosuj "użyj ścisłego" jako część ostatniego przejścia przez twój kod, napraw wszystkie oczywiste problemy, wzrusz ramionami, powiedz "wystarczająco dobre", a następnie wyjmij je do produkcji :) - Wolfie Inu
Osobiście nigdy / bardzo rzadko Dodaj  "use strict"; do istniejącego kodu. Mimo to, prawie zawsze używam go, kiedy piszę nowy kod od zera - Martin
Jeśli już korzystasz z JSLint, prawdopodobnie naprawiłeś większość miejsc, w których "używaj surowego" by łamało pewne rzeczy. - Jonathan Cast


Za pomocą 'use strict'; nie powoduje, że twój kod jest lepszy.

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

'use strict';

Kiedy silnik JavaScript widzi to dyrektywa, zacznie interpretować kod w specjalnym trybie. W tym trybie błędy są zgłaszane, gdy wykrywane są niektóre praktyki kodowania, które mogą okazać się potencjalnymi błędami (co jest przyczyną trybu ścisłego).

Rozważmy ten przykład:

var a = 365;
var b = 030;

W obsesji na punkcie literałów numerycznych programista nieumyślnie zainicjował zmienną b z ósemkowym dosłownym. Tryb nieszablonowy zinterpretuje to jako literał liczbowy z wartością 24 (w podstawie 10). Jednak tryb ścisły spowoduje błąd.

Dla niewyczerpującej listy specjalności w trybie ścisłym zobacz ta odpowiedź.


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

  • W moim Nowy Aplikacja JavaScript: Absolutnie! Tryb ścisły może być wykorzystany jako sygnalizator, gdy robisz coś głupiego z kodem.

  • W moim istniejący Kod 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 zastosować tryb ścisły, powinieneś przygotować się do debugowania i poprawienia istniejącego kodu. Dlatego za pomocą 'use strict'; nie powoduje, że twój kod jest lepszy.


Jak korzystać z trybu ścisłego?

  1. Wstaw a 'use strict'; oświadczenie na górze twojego skryptu:

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

    Zauważ, że wszystko w pliku myscript.js będą interpretowane w trybie ścisłym.

  2. Lub wstaw a 'use strict'; oświadczenie na górze twojego ciała funkcyjnego:

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

    Wszystko w zakres leksykalny funkcji doSomething będą interpretowane w trybie ścisłym. Słowo zakres leksykalny jest tutaj ważny. Widzieć ta odpowiedź dla lepszego wyjaśnienia.


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

znalazłem fajny artykuł opisywanie kilku rzeczy, które są zabronione w trybie ścisłym (zauważ, że nie jest to lista wyłączna):

Zakres

Historycznie JavaScript został zdezorientowany co do funkcji   są zakresowe. Czasami zdają się być statycznie zakreślone, ale niektóre   funkcje sprawiają, że zachowują się tak, jakby były dynamicznie dopasowane. To jest   mylące, utrudniające czytanie i zrozumienie programów.   Nieporozumienie powoduje błędy. To także problem z wydajnością.   Scalanie statyczne pozwoliłoby na zmienne wiązanie podczas kompilacji   czas, ale wymóg dotyczący zakresu dynamicznego oznacza, że ​​powiązanie musi być   odroczony do środowiska wykonawczego, który ma znaczącą wydajność   rzut karny.

Tryb ścisły wymaga, aby wszystkie wiązania zmiennych były wykonywane statycznie.   Oznacza to, że funkcje, które wcześniej wymagały wiązania dynamicznego   musi zostać wyeliminowane lub zmodyfikowane. W szczególności instrukcja with jest   wyeliminowane, a funkcja ewaluacyjna potrafi manipulować   środowisko jego rozmówcy jest poważnie ograniczone.

Jedną z zalet ścisłego kodu jest to, że narzędzia takie jak Kompresor YUI   może wykonać lepszą pracę podczas przetwarzania.

Domniemane globalne zmienne

JavaScript zawiera domyślne zmienne globalne. Gdyby   nie deklarujesz jawnie zmiennej, jest to zmienna globalna   domyślnie zadeklarowane dla ciebie. To ułatwia programowanie   dla początkujących, ponieważ mogą zaniedbać niektóre z ich podstawowego sprzątania   posługi. Ale sprawia, że ​​zarządzanie większymi programami znacznie więcej   trudne i znacznie obniża niezawodność. Tak w ścisłym   Tryb globalne zmienne implikowane nie są już tworzone. Powinieneś   jawnie zadeklaruj wszystkie swoje zmienne.

Globalny wyciek

Istnieje wiele sytuacji, które mogą powodować this   być związanym z obiektem globalnym. Na przykład, jeśli zapomnisz   zapewnić new prefiks podczas wywoływania funkcji konstruktora,   konstruktor this zostanie nieoczekiwanie związany z obiektem globalnym, czyli   zamiast inicjować nowy obiekt, zamiast tego będzie cicho   manipulowanie zmiennymi globalnymi. W takich sytuacjach tryb ścisły będzie   zamiast tego wiąż this do undefined, co spowoduje, że konstruktor to zrobi   zamiast tego wyrzuć wyjątek, umożliwiając wykrycie błędu   wcześniej.

Głośna awaria

JavaScript zawsze miał właściwości tylko do odczytu, ale Ty   nie można ich utworzyć samodzielnie, dopóki nie pojawi się ES5 Object.createProperty   funkcja ujawniła tę zdolność. Jeśli próbujesz przypisać wartość   do właściwości tylko do odczytu, nie powiedzie się po cichu. Zadanie byłoby   nie zmienia wartości właściwości, ale Twój program będzie działał jako   chociaż to miało. Jest to zagrożenie integralności, które może powodować programy   przejść do niespójnego stanu. W trybie ścisłym, próbując zmienić a   Właściwość tylko do odczytu spowoduje zgłoszenie wyjątku.

Oktal

Oktalna (lub podstawowa 8) reprezentacja liczb była wyjątkowo   przydatne podczas programowania maszynowego na maszynach, których słowo   rozmiary były wielokrotnością 3. Ty potrzebowałeś ósemkowy podczas pracy z CDC   6600 mainframe, który miał rozmiar słowa 60 bitów. Jeśli mógłbyś przeczytać   ósemkowo, możesz spojrzeć na słowo jako 20 cyfr. Przedstawiono dwie cyfry   kod operacyjny i jedna cyfra określają jeden z 8 rejestrów. Podczas   powolne przejście od kodów maszynowych do języków wysokiego poziomu, to było   uważane za przydatne do zapewnienia form ósemkowych w językach programowania.

W C niezwykle niefortunna reprezentacja ósemkowa   wybrane: wiodące zero. Tak więc w C, 0100 oznacza 64, a nie 100, i 08 to jest   błąd, nie 8. Jeszcze bardziej niestety ten anachronizm był   skopiowane do prawie wszystkich współczesnych języków, w tym JavaScript, gdzie   służy tylko do tworzenia błędów. Nie ma innego celu. Więc w   tryb ścisły, formy ósemkowe nie są już dozwolone.

I tak dalej

Argument pseudo array staje się nieco bardziej   array-like w ES5. W trybie ścisłym traci swój callee i caller   nieruchomości. Dzięki temu możesz przekazać swoje arguments niezaufany   kod bez rezygnacji z dużej ilości poufnego kontekstu. Ponadto    arguments właściwość funkcji jest wyeliminowana.

W trybie ścisłym duplikowanie kluczy w literale funkcji powoduje powstanie znaku a   błąd składni. Funkcja nie może mieć dwóch parametrów o tej samej nazwie.   Funkcja nie może mieć zmiennej o tej samej nazwie, co jedna z jej nazw   parametry. Funkcja nie może delete własne zmienne. Próba    delete właściwość nie konfigurowalna zgłasza teraz wyjątek. Prymitywny   wartości nie są niejawnie zapakowane.


Zarezerwowane wyrazy dla przyszłych wersji JavaScript

ECMAScript 5 dodaje listę zarezerwowanych słów. Jeśli użyjesz ich jako zmiennych lub argumentów, tryb ścisły spowoduje błąd. Zarezerwowane słowa to:

implements, interface, let, package, private, protected, public, static, i yield


Dalsze czytanie


131
2018-01-29 11:35



to bardzo miłe wyjaśnienie. Mam jednak jedną wątpliwość, czy mogę używać trybu "ścisłego" w połączeniu z innymi bibliotekami skryptów java, takimi jak Angular js? - UVM
@UVM: Dyrektywa trybu ścisłego dotyczy tylko zakresu leksykalnego. tj. tylko plik / funkcję, którą jest zadeklarowany. Jeśli masz inny plik / funkcję, która nie ma 'use strict' dyrektywy, będą wykonywane w trybie nie ścisłym, nawet jeśli wywołane z funkcji działającej w trybie ścisłym. Widzieć ten asnwer dla wyjaśnienia. - Krumia
Dziękuję za wyjaśnienie. Rozumiem, że tryb "ścisły" dotyczy tylko "kodu", a nie jego "wykonania" - UVM
Na drugi rzut oka masz rację. Myślałem, że masz na myśli, że to tylko wyrzucało wyjątki, ale nie zmieniało sposobu działania kodu (jak zmiana this). Teraz widzę, że odnosiłeś się do wywoływania innych funkcji. - CyberEd
W niektórych przypadkach użyteczne jest ósemkowe. Składnia C jest okropna, ale wolałbym, aby języki dodawały nową ósemkową składnię, która mogłaby pozwolić na wycofanie się wiodącej formy zerowej. Oczywiście, dla Javascriptu, który wspierał wiodącą zerową formę, był po prostu głupi. - supercat


Zdecydowanie polecam każdemu programistce, aby teraz zaczął używać trybu ścisłego. Istnieje wystarczająca liczba przeglądarek obsługujących ten tryb, aby rygorystyczny tryb mógł pomóc nam uratować nas przed błędami, o których nawet nie wiedzieliśmy w twoim kodzie.

Najwyraźniej na początkowym etapie pojawią się błędy, z którymi nigdy wcześniej się nie spotkaliśmy. Aby uzyskać pełną korzyść, musimy przeprowadzić odpowiednie testy po przejściu do trybu ścisłego, aby upewnić się, że wszystko złapaliśmy. Zdecydowanie nie rzucamy use strict w naszym kodzie i załóżmy, że nie ma błędów. Tak więc odejście jest takie, że nadszedł czas, aby zacząć używać tej niewiarygodnie przydatnej funkcji językowej do pisania lepszego kodu.

Na przykład,

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

JSLint jest debuggerem napisanym przez Douglasa Crockforda. Wystarczy wkleić skrypt, aby szybko wykryć wszelkie zauważalne problemy i błędy w kodzie.


122
2017-07-05 19:38



@ JamieHutber: Odwiedź ten link caniuse.com/use-strict  I kangax.github.io/es5-compat-table. Zapewni to dokładny pomysł dla wszystkich przeglądarek. - Pank


Chciałbym przedstawić nieco bardziej uzasadnioną odpowiedź, uzupełniającą pozostałe odpowiedzi. Miałem nadzieję na edycję najpopularniejszej odpowiedzi, ale się nie udało. Starałem się, aby był tak kompleksowy i kompletny, jak tylko mogłem.

Możesz odwołać się do Dokumentacja MDN po więcej informacji.

"use strict" dyrektywa wprowadzona w ECMAScript 5.

Dyrektywy są podobne do stwierdzeń, ale różnią się.

  • use strict nie zawiera słów kluczowych: dyrektywa jest prostą instrukcją wyrażenia, która składa się ze specjalnego ciągu literowego (w pojedynczym lub podwójnym cudzysłowie). Silniki JavaScript, które nie implementują ECMAScript 5, widzą jedynie wyrażenie wypowiedzi bez efektów ubocznych. Oczekuje się wprowadzenia kolejnych wersji standardów ECMAScript use jako prawdziwe słowo kluczowe; w ten sposób notowania stałyby się przestarzałe.
  • use strict może być użyty tylko na początku skryptu lub funkcji, tj. 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 implementacyjne). Polecenia wypowiadania ciągów, które następują po pierwszym prawdziwym komunikacie (w skrypcie lub funkcji) są prostymi instrukcjami wyrażenia. Tłumacze nie mogą interpretować ich jako dyrektyw i nie mają żadnego wpływu.

The use strictdyrektywa wskazuje, że poniższy kod (w skrypcie lub funkcji) jest ścisłym kodem. Kod na najwyższym poziomie skryptu (kod, który nie należy do żadnej funkcji) jest uważany za ścisły kod, gdy skrypt zawiera use strict dyrektywa. Treść funkcji jest uważana za ścisły kod, gdy sama funkcja jest zdefiniowana w ścisłym kodzie lub gdy funkcja zawiera use strict dyrektywa. Kod przekazywany do pliku eval() metoda jest uważana za ścisły kod, gdy eval() został wywołany ze ścisłego kodu lub zawiera use strict sama dyrektywa.

Tryb ścisły ECMAScript 5 jest ograniczonym podzbiorem języka JavaScript, który eliminuje odpowiednie defekty języka i charakteryzuje się bardziej rygorystycznym sprawdzaniem błędów i wyższymi poziomami bezpieczeństwa. Poniżej przedstawiono różnice między trybem ścisłym i normalnym (z których pierwsze trzy są szczególnie ważne):

  • Nie możesz użyć with-wymaganie w trybie ścisłym.
  • W trybie ścisłym należy zadeklarować wszystkie zmienne: jeśli przypiszesz wartość do identyfikatora, który nie został zadeklarowany jako zmienna, funkcja, parametr funkcji, parametr catch-clause lub własność globalnej Object, wtedy dostaniesz ReferenceError. W trybie normalnym identyfikator jest domyślnie deklarowany jako zmienna globalna (jako właściwość globalna Object)
  • W trybie ścisłym słowo kluczowe this ma wartość undefined w funkcjach, które zostały wywołane jako funkcje (nie jako metody). (W trybie normalnym this zawsze wskazuje na globalne Object). Ta różnica może być używana do testowania, czy implementacja obsługuje tryb ścisły:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Również gdy wywoływana jest funkcja call() lub apply w trybie ścisłym this jest dokładnie wartością pierwszego argumentu call()lub apply() wezwanie. (W trybie normalnym null i undefined są zastąpione przez globalne Object a wartości, które nie są obiektami, są rzucane do obiektów.)

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

  • W trybie ścisłym, podczas przekazywania kodu do eval(), nie możesz zadeklarować ani zdefiniować zmiennych lub funkcji w zasięgu dzwoniącego (tak jak możesz to zrobić w trybie normalnym). Zamiast tego tworzony jest nowy zakres eval() a zmienne i funkcje mieszczą się w tym zakresie. Ten zakres zostaje zniszczony po eval() kończy wykonywanie.
  • W trybie ścisłym argumenty-obiekt funkcji zawiera statyczną kopię wartości, które są przekazywane do tej funkcji. W trybie normalnym arguments-object ma nieco "magiczne" zachowanie: elementy tablicy i nazwane parametry funkcji odwołują się do tej samej wartości.
  • W trybie ścisłym otrzymasz SyntaxError kiedy delete Po operatorze następuje identyfikator niekwalifikowany (zmienna, funkcja lub parametr funkcji). W trybie normalnym delete wyrażenie nie zrobiłoby nic i zostało ocenione na false.
  • W trybie ścisłym otrzymasz TypeError przy próbie usunięcia właściwości innej niż konfigurowalna. (W trybie normalnym próba po prostu się nie udaje, a deletewyrażenie jest oceniane na false).
  • W trybie ścisłym jest uważany za błąd składniowy podczas próby zdefiniowania kilku właściwości o tej samej nazwie dla literału obiektowego. (W trybie normalnym nie ma błędu.)
  • W trybie ścisłym jest uważany 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 są niedozwolone (są to literały zaczynające się od 0x. (W trybie normalnym niektóre implementacje dopuszczają literały ósemkowe.)
  • W trybie ścisłym identyfikatory eval i arguments są traktowane jak słowa kluczowe. Nie można zmienić ich wartości, nie można przypisać do nich wartości i nie można ich używać jako nazw zmiennych, funkcji, parametrów funkcji lub identyfikatorów bloku catch.
  • W trybie ścisłym są większe ograniczenia dotyczące możliwości sprawdzania stosu wywołań. arguments.caller i arguments.callee przyczyna TypeError w funkcji w trybie ścisłym. Ponadto niektóre właściwości wywołujące i argumenty funkcji w trybie ścisłym powodują TypeError kiedy próbujesz je przeczytać.

81
2018-05-15 06:58



"W trybie ścisłym literały ósemkowe nie są dozwolone (są to literały zaczynające się od 0x ...)" ósemkowe literały zaczynają się od wiodących 0. - Alex Gittemeier