Co robi" use strict " w JavaScript i jakie jest za tym rozumowanie?

Ostatnio przepuściłem część mojego kodu JavaScript przez Jslint I dał następujący błąd:

Problem w linii 1 znak 1: Brak instrukcji "use strict".

Szukając czegoś, zdałem sobie sprawę, że niektórzy ludzie dodają "use strict"; do swojego kodu JavaScript. Po dodaniu instrukcji błąd przestał się pojawiać. Niestety, Google nie ujawnił wiele historii za tym oświadczeniem ciąg. Na pewno ma to coś wspólnego z jak JavaScript jest interpretowany przez przeglądarkę, ale nie mam pojęcia jaki będzie efekt.

Więc o co w tym wszystkim chodzi, co to oznacza i czy jest nadal aktualne?

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

Author: Mark Rogers, 2009-08-26

25 answers

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

Zacytuję kilka ciekawych części:

Tryb ścisły to nowa funkcja w ECMAScript 5, która pozwala na umieszczenie programu lub funkcji w "ścisłym" kontekście operacyjnym. Ten ścisły kontekst zapobiega podejmowaniu pewnych działań i powoduje pojawienie się większej liczby WYJĄTKÓW.

I:

Tryb ścisły pomaga w kilku sposoby:

  • łapie kilka popularnych blooperów kodujących, rzucając wyjątki.
  • zapobiega lub wyrzuca 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.

Zauważ również, że możesz zastosować "tryb ścisły" do całego pliku... Możesz też użyć go tylko dla określonej funkcji (wciąż cytując z Johna Resiga Artykuł):

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

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

Więc przypuszczam, że jest to trochę jak "use strict" można użyć w Perlu (stąd nazwa?) : pomaga popełnić mniej 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 (bar IE 9 i poniżej) .

 4470
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 00:38:38

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

To tylko ciąg znaków, który umieszczasz w plikach JavaScript (na górze pliku lub wewnątrz funkcji), który wygląda tak:

"use strict";

Umieszczenie go teraz w kodzie nie powinno powodować żadnych problemów z bieżącymi przeglądarkami, ponieważ jest to tylko ciąg znaków. Może to spowodować problemy z kodem w przyszłości, jeśli kod narusza pragma. Na przykład, jeśli aktualnie posiadasz foo = "bar" bez definiowanie foo najpierw Twój kod zacznie zawodzić...co moim zdaniem jest dobrą rzeczą.

 1121
Author: seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-26 10:31:59

Instrukcja "use strict"; instruuje przeglądarkę do korzystania z trybu ścisłego, który jest zredukowanym i bezpieczniejszym zestawem funkcji JavaScript.

Lista funkcji (niewyczerpująca)

  1. Wyłącza zmienne globalne. (Wyłapuje brakujące var deklaracje i literówki w nazwach zmiennych)

  2. Ciche niepowodzenie przydziałów spowoduje błąd w trybie ścisłym (przypisanie NaN = 5;)

  3. Próba usunięcia właściwości nie do usunięcia spowoduje wyrzucenie (delete Object.prototype)

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

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

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

  7. Zabrania with słowa kluczowego

  8. eval w trybie strict nie wprowadza nowych zmiennych

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

  10. Zabrania wiązania lub przypisywania nazw eval i arguments w jakiejkolwiek formie

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

  12. arguments.callee nie jest obsługiwane

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

 532
Author: gprasant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 18:30:33

Jeśli ludzie obawiają się używania use strict może warto zajrzeć do tego artykułu:

Obsługa ECMAScript 5 'Strict mode' w przeglądarkach. Co to oznacza?
NovoGeek.com -Krishna ' s weblog

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

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.
*/
 375
Author: Jamie Hutber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 11:13:12

Uwaga, wszyscy ciężko obciążający Programiści: stosowanie "use strict" do istniejącego kodu może być niebezpieczne! Ta rzecz nie jest jakąś naklejką, która sprawia, że czujesz się dobrze, szczęśliwa twarz, którą możesz nałożyć na kod, aby uczynić go "lepszym". Z "use strict" pragma, przeglądarka nagle rzuci wyjątki w losowych miejscach, że nigdy nie rzucił przed tylko dlatego, że w tym miejscu robisz coś, co domyślnie / luźne JavaScript radośnie pozwala, ale ścisłe JavaScript brzydzi! Możesz mieć naruszenia surowości ukrywając w rzadko używanych wywołaniach w Twoim kodzie, które rzucają 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ę poddać, dobrze jest zastosować "use strict" obok kompleksowych testów jednostkowych i ściśle skonfigurowanego zadania budowania JSHint, które da ci pewność, że nie ma ciemnego zakątka twojego modułu, który wybuchnie okropnie tylko dlatego, że włączyłeś tryb ścisły. Albo, Hej, oto inna opcja: po prostu nie dodawaj "use strict" do żadnego ze swoich starszych kodów, jest to prawdopodobnie bezpieczniejsze, szczerze. zdecydowanie nie dodawaj do żadnych modułów, których nie posiadasz lub nie utrzymujesz, takich jak moduły stron trzecich.

Myślę, że nawet jeśli jest to śmiertelnie uwięzione zwierzę, "use strict" może być dobry, ale musisz to zrobić dobrze. Najlepszy czas, aby przejść rygorystyczne jest, gdy projekt jest greenfield i zaczynasz od zera. Konfiguracja JSHint/JSLint ze wszystkimi ostrzeżeniami i opcjami podkręconymi jako ciasno, jak Twój zespół może wytrzymać, uzyskać dobry build / test/assert system du jour uzbrojony jak Grunt+Karma+Chai, a dopiero potem rozpocząć oznaczanie wszystkich nowych modułów jako "use strict". Bądź przygotowany na wyleczenie wielu czarnych błędów i ostrzeżeń. Upewnij się, że wszyscy rozumieją grawitację, konfigurując kompilację tak, aby zawierała się, jeśli JSHint/JSLint spowoduje jakiekolwiek naruszenia.

Mój projekt nie był projektem greenfield, kiedy go zaadoptowałem "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. To dla mnie przypomnienie o tym, co refaktoryzacja powinienem zrobić w przyszłości. Moim celem jest być wolnym od czerwonych znaków ze względu na wszystkie moje brakujące "use strict" oświadczenia, ale to już lata.

 188
Author: DWoldrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-16 09:10:15

Użycie 'use strict'; nagle nie poprawi Twojego kodu.

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

'use strict';

Gdy silnik JavaScript zobaczy tę dyrektywę , zacznie interpretować kod w trybie specjalnym. W tym trybie błędy są wyrzucane, gdy wykryte zostaną pewne praktyki kodowania, które mogą stać się potencjalnymi błędami (które jest rozumowaniem stojącym za trybem ścisłym).

Rozważ ten przykład:

var a = 365;
var b = 030;

W swojej obsesji na punkcie ustawiania liter liczbowych, programista przypadkowo zainicjował zmienną b literałem ósemkowym. Tryb Non-strict zinterpretuje to jako literał liczbowy z wartością 24 (w bazie 10). Jednak tryb ścisły spowoduje błąd.

Aby uzyskać niewyczerpującą listę specjalności w trybie ścisłym, zobacz ta odpowiedź .


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

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

  • W moim istniejącym kod JavaScript: prawdopodobnie nie! jeśli twój istniejący kod JavaScript ma instrukcje, które są zabronione w trybie ścisłym, aplikacja po prostu pęknie. Jeśli chcesz tryb ścisły, powinieneś być przygotowany do debugowania i poprawiania istniejącego kod. To dlatego użycie 'use strict'; nagle nie poprawi Twojego kodu .


Jak używać trybu ścisłego?

  1. Wstaw 'use strict'; Oświadczenie na górze skryptu:

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

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

  2. Lub wstawić 'use strict'; Oświadczenie na górze ciała funkcji:

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

    Wszystko w zakres leksykalny funkcji doSomething będzie interpretowane w trybie ścisłym. Ważne jest tu słowo zakres leksykalny . Zobacz ta odpowiedź dla lepszego wyjaśnienia.


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

Znalazłem ładny artykuł opisujący kilka rzeczy, które są zabronione w trybie ścisłym (zauważ, że nie jest to lista ekskluzywna): {]}

Zakres

Historycznie JavaScript był mylony z funkcjami / align = "left" / Czasami wydają się być statycznie ustawione, ale niektóre funkcje sprawiają, że zachowują się tak, jakby były dynamicznie ustawione. To jest mylące, utrudniające czytanie i rozumienie programów. Nieporozumienie powoduje błędy. Jest to również problem dla wydajności. Statyczny zakres pozwala na Wiązanie zmiennych podczas kompilacji czasu, ale wymóg dynamicznego zakresu oznacza, że Wiązanie musi być odroczony do wykonania, co wiąże się ze znaczną wydajnością kara.

Tryb ścisły wymaga, aby wszystkie wiązania zmiennych były wykonywane statycznie. Oznacza to, że funkcje, które wcześniej wymagały dynamicznego wiązania należy je wyeliminować lub zmodyfikować. W szczególności twierdzenie with jest wyeliminowane, a zdolność funkcji eval do manipulowania przy środowisko jego rozmówcy jest mocno ograniczone.

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

Impliced Global Zmienne

JavaScript zawiera zmienne globalne. Jeśli nie deklarujesz jawnie zmiennej, zmienna globalna jest bezwarunkowo zadeklarowane dla Ciebie. Ułatwia to programowanie początkującym, ponieważ mogą zaniedbać niektóre z podstawowych obowiązki. Ale to sprawia, że zarządzanie większymi programami znacznie bardziej trudne i znacznie pogarsza niezawodność. Więc w ścisłym tryb, domyślne zmienne globalne nie są już tworzone. Powinieneś jawnie zadeklaruj wszystkie Twoich zmiennych.

Globalny Wyciek

Istnieje wiele sytuacji, które mogą spowodować this być przywiązanym do obiektu globalnego. Na przykład, jeśli zapomnisz podaj prefiks new podczas wywoływania funkcji konstruktora, konstruktora this będzie nieoczekiwanie związany z obiektem globalnym, więc zamiast inicjalizacji nowego obiektu, będzie on w ciszy manipulowanie zmiennymi globalnymi. W takich sytuacjach tryb ścisły będzie zamiast bind this do undefined, co spowoduje, że konstruktor zamiast tego wyrzuć wyjątek, umożliwiając wykrycie błędu znacznie wcześniej.

Głośna Awaria

JavaScript zawsze miał właściwości tylko do odczytu, ale ty nie można ich stworzyć samodzielnie, dopóki ES5 ' s Object.createProperty funkcja ujawniła tę zdolność. W przypadku próby przypisania wartości do właściwości tylko do odczytu, to zawiedzie po cichu. Zadanie byłoby nie zmienia wartości nieruchomości, ale program będzie postępował jak chociaż tak było. Jest to Zagrożenie integralności, które może spowodować, że programy wejść w stan niespójności. W trybie ścisłym, próba zmiany właściwość tylko do odczytu spowoduje wyświetlenie wyjątku.

Oktal

Ósemkowa (lub baza 8) reprezentacja liczb była niezwykle przydatne podczas programowania na maszynach, których słowo rozmiary były wielokrotnością 3. Podczas pracy z CDC potrzebowałeś ósemki 6600 mainframe, który miał rozmiar słowa 60 bitów. Gdybyś mógł Czytaj ósemka, można spojrzeć na słowo jako 20 cyfr. Reprezentowane dwie cyfry kod op i jedna cyfra wskazywały jeden z 8 rejestrów. Podczas powolne przejście od kodów maszynowych do języków wysokiego poziomu, było uważany za przydatny do dostarczania form ósemkowych w językach programowania.

W C, niezwykle niefortunne przedstawienie oktalności było wybrano: lokal użytkowy zero. Więc w C, 0100 oznacza 64, a nie 100, a 08 jest błąd, nie 8. Jeszcze bardziej niestety, to anachronizm został 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.

Et Cetera

Pseudo tablica argumentów staje się nieco bardziej array-jak w ES5. W trybie ścisłym traci swoje callee i caller właściwości. Dzięki temu można przekazać arguments do niezaufanego kod bez rezygnacji z wielu poufnych kontekst. Ponadto, arguments własność funkcji jest wyeliminowana.

W trybie ścisłym, zduplikowane klucze w funkcji literalnej będą produkować 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 parametry. Funkcja nie może delete własnych zmiennych. Próba delete nie-konfigurowalna właściwość rzuca teraz wyjątek. Primitive wartości nie są niejawne zapakowane.


Słowa zarezerwowane dla przyszłych wersji JavaScript

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

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


Czytaj Dalej

 137
Author: Krumia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:50

Zdecydowanie polecam każdemu programiście, aby teraz zaczął używać trybu ścisłego. Jest wystarczająco dużo przeglądarek obsługujących to, że tryb ścisły będzie legalnie pomóc uratować nas przed błędami, o których nawet nie wiedzieliśmy, że w kodzie.

Najwyraźniej na początkowym etapie pojawią się błędy, których nigdy wcześniej nie napotkaliśmy. Aby uzyskać pełną korzyść, musimy wykonać odpowiednie testy po przejściu do trybu ścisłego, aby upewnić się, że złapaliśmy wszystko. Zdecydowanie nie wrzucamy use strict do naszego kodu i zakładamy nie ma żadnych błędów. Więc churn jest to, że nadszedł czas, aby rozpocząć korzystanie z 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 jest debugerem napisanym przez Douglasa Crockforda. Wystarczy wkleić skrypt, aby szybko skanował w poszukiwaniu zauważalnych problemów i błędów w kodzie.

 125
Author: Pank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 15:54:56

Chciałbym zaproponować nieco bardziej uzasadnioną odpowiedź uzupełniającą Pozostałe odpowiedzi. Miałem nadzieję edytować najpopularniejszą odpowiedź, ale zawiodłem. Starałem się, aby była tak kompleksowa i kompletna, jak tylko mogłem.

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

"use strict" dyrektywa wprowadzona w ECMAScript 5.

Dyrektywy są podobne do oświadczeń, ale inne.

  • use strict nie zawiera słów kluczowych: dyrektywa jest Instrukcja simple expression, która składa się ze specjalnego ciągu znaków (w pojedynczych lub podwójnych cudzysłowach). Silniki JavaScript, które nie implementują ECMAScript 5, widzą jedynie wyrażenie bez efektów ubocznych. Oczekuje się, że przyszłe wersje standardów ECMAScript wprowadzą use jako prawdziwe słowo kluczowe; w ten sposób cudzysłowy staną się przestarzałe.
  • use strict może być użyte tylko na początku skryptu lub funkcji, tzn. musi poprzedzać każde inne (rzeczywiste) polecenie. Nie musi być pierwszą instrukcją w skrypcie funkcji: może być poprzedzona innymi wyrażeniami instrukcji, które składają się z literałów łańcuchowych ( a implementacje JavaScript mogą traktować je jako dyrektywy specyficzne dla implementacji). Polecenia literałów ciągów, które następują po pierwszym rzeczywistym poleceniu (w skrypcie lub funkcji)są prostymi wyrażeniami. Tłumacze nie mogą interpretować ich jako dyrektyw i nie mają one żadnego skutku.

Dyrektywa use strict wskazuje, że następujące kod (w skrypcie lub funkcji) jest kodem ścisłym. Kod na najwyższym poziomie skryptu (kod, który nie jest w funkcji) jest uważany za Kod ścisły, gdy skrypt zawiera dyrektywę use strict. Zawartość funkcji jest uważana za Kod ścisły, gdy sama funkcja jest zdefiniowana w kodzie ścisłym lub gdy funkcja zawiera dyrektywę use strict. Kod przekazywany do metody eval() jest uważany za Kod ścisły, gdy {[8] } został wywołany z kodu ścisłego lub zawiera dyrektywę use strict siebie.

[45]}ścisły tryb ECMAScript 5 jest ograniczonym podzbiorem języka JavaScript, który eliminuje istotne deficyty języka i oferuje bardziej rygorystyczne sprawdzanie błędów i wyższe 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ć instrukcji with-w trybie ścisłym.
  • w trybie strict wszystkie zmienne muszą być zadeklarowane: jeśli przypisujesz wartość do identyfikatora, który nie został zadeklarowany jako zmienna, funkcja, parametr funkcji, parametr catch-clause lub właściwość globalnej Object, wtedy otrzymasz ReferenceError. W trybie normalnym identyfikator jest domyślnie deklarowany jako zmienna globalna (jako właściwość global Object)
  • w trybie ścisłym słowo kluczowe this ma wartość undefined w funkcjach, które były wywoływane jako FUNKCJE (NIE jako metody). (W trybie normalnym this zawsze wskazuje na globalny Object). Ta różnica może jest używany do testowania, czy implementacja obsługuje tryb ścisły:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Również gdy funkcja jest wywoływana z call() lub apply w trybie ścisłym, to {[15] } jest dokładnie wartością pierwszego argumentu wywołania call()lub apply(). (W trybie normalnym null i undefined są zastępowane przez globalne Object, A wartości, które nie są obiektami, są wrzucane do obiektów.)

  • W trybie ścisłym otrzymasz TypeError, gdy spróbujesz przypisać do właściwości readonly lub definiowanie nowych właściwości dla obiektu nie rozszerzalnego. (W trybie normalnym oba po prostu nie działają bez komunikatu o błędzie.)

  • w trybie strict, przekazując kod do eval(), nie Można zadeklarować ani zdefiniować zmiennych lub funkcji w zakresie wywołującego (jak można to zrobić w trybie normalnym). Zamiast tego tworzony jest nowy zakres dla eval(), A zmienne i funkcje mieszczą się w tym zakresie. Ten zakres jest niszczony po zakończeniu wykonywania eval().
  • 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, gdy po operatorze delete następuje niekwalifikowany identyfikator (zmienna, funkcja lub parametr funkcji). W trybie normalnym wyrażenie delete nie robi nic i jest ocenione do false.
  • w trybie ścisłym otrzymasz TypeError, gdy spróbujesz usunąć nie konfigurowalną właściwość. (W trybie normalnym próba po prostu nie powiodła się i wyrażenie delete jest oceniane na false).
  • w trybie ścisłym jest to uważane za błąd składniowy podczas próby zdefiniowania kilku właściwości o tej samej nazwie dla obiektu. (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 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 eval i {[40] } są traktowane jak słowa kluczowe. Nie można zmienić ich wartości, nie można przypisać im wartości ani używać ich jako nazw zmiennych, funkcji, parametrów funkcji lub identyfikatorów przechwytywania blok.
  • w trybie ścisłym jest więcej ograniczeń dotyczących możliwości zbadania stosu wywołań. arguments.caller i arguments.callee powodują a TypeError w funkcji w trybie ścisłym. Co więcej, niektóre właściwości funkcji wywołujących i argumentów w trybie ścisłym powodują TypeError, gdy próbujesz je odczytać.
 83
Author: Ely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 20:31:23

moje dwa grosze:

Jednym z celów strict mode jest umożliwienie szybszego debugowania problemów. Pomaga programistom, rzucając wyjątek, gdy występują pewne złe rzeczy, które mogą powodować ciche i dziwne zachowanie strony internetowej. W momencie, gdy użyjemy use strict, Kod wyrzuci błędy, które pomogą programiście go wcześniej naprawić.

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

Zapobiega Zmiennej Globalnej Deklaracja:

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 nameoftree w zasięgu globalnym, do którego można uzyskać dostęp za pomocą window.nameoftree. Gdy zaimplementujemy use strict Kod spowoduje błąd.

Uncaught ReferenceError: nameoftree nie jest zdefiniowane

próbka

eliminuje with stwierdzenie :

with wyrażenia nie mogą być minifigurowane przy użyciu narzędzi takich jak uglify-js. Są również przestarzałe i usunięte z przyszłych wersji JavaScript.

próbka

Zapobiega Duplikatom :

Gdy mamy duplikat właściwości, wyrzuca wyjątek

Uncaught SyntaxError: Duplicate data property in object literal not dozwolone w trybie ścisłym

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};
Jest ich jeszcze kilka, ale muszę zdobyć więcej wiedzy na ten temat.
 75
Author: Shubh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-21 13:31:24

Jeśli używasz przeglądarki wydanej w zeszłym roku lub tak to najprawdopodobniej obsługuje JavaScript Strict mode. Tylko starsze przeglądarki, zanim ECMAScript 5 stał się obecnym standardem, nie obsługują go.

Cudzysłowy wokół polecenia upewniają się, że kod nadal będzie działał również w starszych przeglądarkach (chociaż rzeczy, które generują błąd składni w trybie ścisłym, zwykle powodują awarię skryptu w trudny do wykrycia sposób w tych starszych przeglądarkach).

 56
Author: Stephen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 03:31:15

Strict mode wprowadza kilka zmian do normalnej semantyki JavaScript:

  • Eliminuje niektóre ciche błędy JavaScript, zmieniając je rzucać błędy.

  • Naprawia błędy, które utrudniają obsługę JavaScript silniki do wykonywania optymalizacji.

  • Zakazuje pewnej składni, która może być zdefiniowana w przyszłości wersje ECMAScript.

Aby uzyskać więcej informacji visit Strict Mode-Javascript

 49
Author: Renganathan M G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 17:34:22

Podczas dodawania "use strict";, następujące przypadki rzucąSyntaxError przed wykonaniem skryptu:

  • torowanie drogi dla przyszłych wersji ECMAScript , przy użyciu jednego z nowo zarezerwowanych słów kluczowych (w prevision 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ż globalny obiekt.

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

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

    Tak już nie jest w ECMAScript 6 (bug 1041128 ).

  • Deklarowanie dwóch argumentów funkcji o tej samej nazwie funkcja

    f(a, b, b){}
    
  • Ustawianie wartości na niezgłoszoną zmienną

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

  • Używanie eval lub arguments jako nazwy zmiennej lub argumentu funkcji

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

Źródła:

 49
Author: zangw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 10:50:18

"use Strict" ; jest gwarancją, że programista nie będzie używał luźnych lub złych właściwości JavaScript. Jest to przewodnik, podobnie jak linijka pomoże Ci zrobić proste linie. "Użyj ścisłego" pomoże Ci zrobić "proste kodowanie".

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

Uwierz mi. Narzut jest znikomy w porównaniu do źle zaprojektowanego kodu. Doug Crockford, który był starszy programista JavaScript od kilku lat, ma bardzo ciekawy post tutaj. Osobiście lubię wracać na jego stronę cały czas, 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 uczyniła tryb" ścisły " opcjonalnym , jest umożliwienie mniej doświadczonym programistom dostępu do JavaScript i danie czasu na dostosowanie się do nowych i bezpieczniejszych praktyk kodowania.

 47
Author: user2436758,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-26 10:34:02

Włączenie use strict na początku wszystkich wrażliwych plików JavaScript od tego momentu jest małym sposobem na bycie lepszym programistą JavaScript i uniknięcie globalnych zmiennych losowych, a wszystko zmienia się po cichu.

 43
Author: Placeholder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 15:55:42

Cytowanie z w3schools :

Dyrektywa "use strict"

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

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

Celem "use strict" jest wskazanie, że kod powinien być wykonywane w "trybie ścisłym".

W trybie strict nie można np. używać zmienne.

Dlaczego Tryb Ścisły?

Strict mode ułatwia pisanie" bezpiecznego " JavaScript.

Tryb ścisły zmienia wcześniej zaakceptowaną "złą składnię" w prawdziwe błędy.

Jako przykład, w normalnym JavaScript, błędne wpisanie nazwy zmiennej tworzy Nowa zmienna globalna. W trybie ścisłym spowoduje to błąd, uniemożliwiając przypadkowe utworzenie zmiennej globalnej.

W normalnym JavaScript programista nie otrzyma żadnego błędu informacje zwrotne przypisywanie wartości do właściwości nie do zapisu.

W trybie ścisłym, każde przypisanie do właściwości nie do zapisu, a nieruchomość jednorodzinna, nieruchomość nieistniejąca, nieruchomość nieistniejąca zmienna lub nieistniejący obiekt wyrzuci błąd.

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

 35
Author: Mehul Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 03:15:37

Jest dobra rozmowa niektórych ludzi, którzy byli w ECMAScript committee: Changes to JavaScript, Part 1: ECMAScript 5 " o tym, jak przyrostowe użycie przełącznika "use strict" pozwala implementatorom JavaScript oczyścić wiele niebezpiecznych funkcji JavaScript bez nagle łamania każdej strony na świecie.

Oczywiście mówi również o tym, czym są (były) błędy i jak ECMAScript 5 je naprawia.

 28
Author: FutureNerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-29 19:39:26

"use strict" sprawia, że kod JavaScript działa w trybie strict , co w zasadzie oznacza, że wszystko musi być zdefiniowane przed użyciem. Głównym powodem używania trybu ścisłego jest unikanie przypadkowych globalnych zastosowań niezdefiniowanych metod.

Również w trybie ścisłym, rzeczy działają szybciej, niektóre ostrzeżenia lub ciche Ostrzeżenia rzucają fatalne 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 stwierdzenia i przykłady z MDN:

Dyrektywa "use strict"
dyrektywa "use strict" jest nowością w JavaScript 1.8.5 (ECMAScript wersja 5). Nie jest to stwierdzenie, ale wyrażenie dosłowne, ignorowane przez wcześniejsze wersje JavaScript. Na celem "use strict" jest wskazanie, że kod powinien być wykonywane w "trybie ścisłym". W trybie ścisłym nie można na przykład, użycie zmienne niezgłoszone.

Przykłady użycia "use strict":
Strict mode dla funkcji: podobnie, aby wywołać strict mode dla function, umieść dokładne stwierdzenie "use strict"; (lub "use strict";) w ciało funkcji przed innymi wypowiedziami.

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) whole-script strict mode

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

3) przypisanie do nie zapisywalnego globalnego

'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 Czytaj więcej na MDN .

 27
Author: Alireza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 15:16:03

Zauważ, że {[0] } został wprowadzony w EcmaScript 5 i był przechowywany od tego czasu.

Poniżej znajdują się warunki uruchomienia trybu ścisłego w ES6 i ES7 :

  • Kod Globalny jest kodem strict mode, jeśli zaczyna się od dyrektywy, która zawiera dyrektywę Use Strict (patrz 14.1.1).
  • kod modułu jest zawsze ścisłym kodem trybu.
  • Wszystkie Części ClassDeclaration lub A Classeexpression są trybem ścisłym kod.
  • Kod Eval jest kodem strict mode, jeśli zaczyna się od prologu dyrektywy, który zawiera dyrektywę Use Strict lub jeśli wywołanie eval jest bezpośrednim kodem eval (patrz 12.3.4.1), który jest zawarty w kodzie strict mode.
  • kod funkcji jest kodem strict mode, jeśli skojarzony FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, or ArrowFunction {[19] } jest zawarty w kodzie strict mode lub jeśli kod wytwarzający wartość wewnętrzny slot funkcji [[ECMAScriptCode]] zaczyna się od dyrektywy, która zawiera dyrektywę Use Strict.
  • kod funkcji dostarczany jako argumenty wbudowanych konstruktorów funkcji i generatora jest kodem strict mode, jeśli ostatni argument jest ciągiem znaków, który po przetworzeniu jest FunctionBody, który zaczyna się od dyrektywy Prolog, która zawiera dyrektywę Use Strict.
 17
Author: Oriol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 00:25:07

Mały przykład do porównania:

Tryb niestandardowy:

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
 11
Author: Tân Nguyễn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-10 17:01:20

Główne powody, dla których programiści powinni używać "use strict" to:

  1. Zapobiega przypadkowej deklaracji zmiennych globalnych.Użycie {[3] } upewni się, że zmienne są zadeklarowane za pomocą var przed użyciem. Eg:

    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: dyrektywa "use strict" jest rozpoznawana tylko na początku skryptu lub funkcji.
  3. Łańcuch "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 będzie rzucaj błędy.

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

Aby przeczytać więcej na ten temat, Możesz znaleźć tutaj .

 11
Author: Pritam Banerjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-18 03:14:24

use strict to sposób na uczynienie kodu bezpieczniejszym, ponieważ nie możesz używać niebezpiecznych funkcji, które mogą działać niezgodnie z oczekiwaniami.I tak jak napisano, zanim kod stał się bardziej surowy.

 10
Author: Просто программист,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-17 22:31:29

"use strict"; jest wysiłkiem ECMA, aby JavaScript był trochę bardziej wytrzymały. Wprowadza w JS próbę uczynienia go co najmniej trochę "ścisłym" (inne języki implementują ścisłe reguły od lat 90.). To faktycznie "zmusza" programistów JavaScript do przestrzegania pewnego rodzaju najlepszych praktyk kodowania. Mimo to JavaScript jest bardzo delikatny. Nie ma czegoś takiego jak typowane zmienne, metody itd. Zdecydowanie polecam programistom JavaScript, aby nauczyli się bardziej solidnego języka, takiego jak Java lub ActionScript3, i wdrożyć te same najlepsze praktyki w kodzie JavaScript, będzie działać lepiej i będzie łatwiej debugować.

 10
Author: PippoApps.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 23:18:44

Use Strict służy do wyświetlania typowych i powtarzających się błędów, dzięki czemu jest inaczej obsługiwane i zmienia sposób działania java script, takie zmiany to:

  • Zapobiega przypadkowym globalom

  • Brak duplikatów

  • Eliminuje z

  • Eliminuje ten przymus

  • Safer eval()

  • Errors for immutables

Możesz również przeczytać ten artykuł Aby poznać szczegóły

 9
Author: Wesam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 14:09:17

Normalnie java script nie przestrzega ścisłych zasad, co zwiększa szanse na błędy. Po użyciu "use strict", kod java script powinien przestrzegać ścisłych reguł, jak w innych językach programowania, takich jak użycie Terminatorów, deklaracja przed inicjalizacją itp.

Jeśli "use strict" jest używany, to kod powinien być napisany według ścisłego zestawu reguł, co zmniejsza szanse na błędy i niejasności.

 9
Author: Bikash Chapagain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-20 16:23:54

Tryb JavaScript "strict" wprowadza w ECMAScript 5.

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

Zapisanie "use strict"; na samej górze pliku JS włącza strict sprawdzanie składni. Wykonuje za nas następujące zadania:

(i) wyświetla błąd podczas próby przypisania do nierejestrowanej zmiennej

(ii) uniemożliwia nadpisanie kluczowych bibliotek systemowych JS

(ii) zabrania niektórych niebezpiecznych lub podatnych na błędy cech języka

"use strict" działa również wewnątrz poszczególnych funkcji. Zawsze jest to lepsza praktyka, aby włączyć " Użyj ścisłego w kodzie.

Problem Ze Zgodnością Przeglądarki: Dyrektywy "use" mają być zgodne wstecz. Przeglądarki, które ich nie obsługują, po prostu zobaczą literalny ciąg znaków, który nie jest dalej odwoływany. Więc przejdą nad nim i pójdą dalej.

 8
Author: Rabin Pantha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 05:40:45