2011-12-28 13 views
121

Przeglądałem odnośniki do JavaScript w Mozilla Developer Network i natknąłem się na coś o nazwie "strict mode". Przeczytałem to i mam problem ze zrozumieniem, co robi. Czy ktoś może wyjaśnić (ogólnie), jaki jest jego cel i jak jest użyteczny?co to jest "tryb ścisły" i jak się go używa?

+1

pokrewne: http://stackoverflow.com/q/1335851/1461424 – Krumia

Odpowiedz

135

Jego głównym celem jest wykonanie większej liczby sprawdzeń.

Po prostu dodaj "use strict"; u góry kodu, przed czymkolwiek innym. Na przykład: blah = 33; jest prawidłowym kodem JavaScript. Oznacza to, że tworzysz całkowicie globalną zmienną blah.

Ale w trybie ścisłym jest to błąd, ponieważ nie użyto słowa kluczowego "var" do zadeklarowania zmiennej.

Większość czasu nie znaczy tworzyć zmienne globalne w środku jakiegoś dowolnego zakresu, więc przez większość czasu, że blah = 33 jest napisane to jest błąd i programista faktycznie nie chcą go być zmienną globalną, chcieli napisać var blah = 33.

Podobnie uniemożliwia wiele rzeczy, które są technicznie poprawne. NaN = "lol" nie powoduje błędu. Nie zmienia także wartości NaN. używanie ścisłego tego (i podobnych dziwnych instrukcji) powoduje błędy. Większość ludzi to docenia, ponieważ nie ma powodu, aby kiedykolwiek pisać NaN = "lol", więc najprawdopodobniej wystąpił błąd literowy.

Read more at the MDN page on strict mode

+4

jest dokładną kopią dokumentacji na co MDN – nkcmr

+23

Czego nie rozumiesz o jego użyteczności wtedy? Ma na celu pomóc w rozwoju, łapiąc rzeczy, które są poprawnymi, ale najprawdopodobniej błędami. –

20

Tryb ścisły dodano tak, że nie będzie łatwo statycznie analyzable podzbiorem ECMAScript, który byłby dobrym celem dla przyszłych wersjach języka. Tryb ścisły został także zaprojektowany z nadzieją, że twórcy, którzy ograniczą się do trybu ścisłego, popełniliby mniej błędów, a błędy, które robią, przejawiałyby się w bardziej oczywisty sposób.

Harmony, która, miejmy nadzieję, stanie się następną ważną wersją EcmaScript, będzie zbudowana na podstawie ścisłej normy ES5.

Harmonia opiera się na trybie ścisłym ES5, aby uniknąć zbyt wielu trybów.

Niektóre inne eksperymenty językowe również zależą od trybu ścisłego. SES zależy od możliwości analizy w trybie ścisłym ES5.

SES (Secure ECMAScript) Projekt Eksperyment

Projekt Object Capability Język programowania poprzez usunięcie lub naprawę funkcje ES5/ścisłym.

Powinno być dostępne tłumaczenie z SES na ES5/Strict.

Annex C normy wyjaśnia różnice między trybem ścisłym a normalnym.

Ścisłe ograniczenie tryb i wyjątki

  • Identyfikatory "narzędzi", "interfejs", "niech", "pakiet", "prywatny", "chronione", "publiczny", „statyczne "i" yield "są klasyfikowane jako tokeny FutureReservedWord w ramach kodu trybu ścisłego. (7.6.12 [?]).
  • Realizująca implementacja, podczas przetwarzania kodu trybu ścisłego, może nie rozszerzać składni NumericLiteral (7.8.3), aby uwzględnić OctalIntegerLiteral, jak opisano w B.1.1.
  • Realizująca implementacja, przy przetwarzaniu kodu trybu ścisłego (patrz 10.1.1), może nie rozszerzać składni EscapeSequence, aby uwzględnić OctalEscapeSequence, jak opisano w B.1.2.
  • Przypisanie niezadeklarowanemu identyfikatorowi lub nierozstrzygalnej referencji nie tworzy właściwości w obiekcie globalnym. Gdy proste przypisanie występuje w kodzie trybu ścisłego, jego LeftHandSide nie może oceniać nierozwiązywalnego Reference. Jeśli zostanie zgłoszony wyjątek ReferenceError (8.7.2). LeftHandSide może również nie być odwołaniem do właściwości data o wartości atrybutu {[[Write]]: false}, do właściwości accessor z wartością atrybutu {[[Set]]: undefined}, ani do nieistniejącego właściwość obiektu, którego właściwość wewnętrzna [[Rozszerzalna]] ma wartość false. W takich przypadkach generowany jest wyjątek TypeError (11.13.1).
  • Identyfikator eval lub argumenty mogą nie pojawiać się jako LeftHandSideExpression operatora przypisania (11.13) lub PostfixExpression (11.3) lub jako UnaryExpression obsługiwany przez przyrostek prefiksu (11.4.4) lub Deksment przedrostkowy (11.4. 5) operator. Obiekty argumentów dla funkcji trybu ścisłego definiują nie konfigurowalne właściwości akcesory o nazwach "wywołujący" i "wywołujący", które rzucają wyjątek TypeError na dostępie (10.6).
  • Obiekty argumentów dla funkcji trybu ścisłego nie dzielą dynamicznie swoich wartości właściwości indeksowanych tablicy z odpowiednimi powiązaniami parametrów formalnych ich funkcji. (10.6). Dla funkcji trybu ścisłego, jeśli tworzony jest obiekt arguments, powiązanie argumentów lokalnego identyfikatora z obiektem arguments jest niezmienne, a tym samym może nie być celem wyrażenia przypisania. (10.5).
  • Jest to błąd składni, jeśli kod trybu ścisłego zawiera obiektLitel z więcej niż jedną definicją właściwości danych (11.1.5). Jest to błąd składni, jeśli identyfikator "eval" lub identyfikator "argumenty" występuje jako identyfikator w właściwości PropertySetParameterList właściwości propertyAssignment, która jest zawarta w ścisłym kodzie lub jeśli jej funkcja jest ścisłym kodem (11.1.5).
  • Kod eval w ścisłym trybie nie może tworzyć instancji zmiennych lub funkcji w zmiennym środowisku wywołującego do eval. Zamiast tego tworzone jest nowe środowisko zmiennych i środowisko jest używane do tworzenia powiązań deklaracji dla kodu eval (10.4.2).
  • Jeśli jest to oceniane w ramach kodu trybu ścisłego, to ta wartość nie jest wymuszana na obiekcie. Wartość null lub undefined nie jest konwertowana na obiekt globalny, a wartości pierwotne nie są konwertowane na obiekty opakowania. Ta wartość przekazywana za pośrednictwem wywołania funkcji (w tym wywołań za pomocą Function.prototype.apply i Function.prototype.call) nie wymuszaj przekazania tej wartości do obiektu (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Gdy operator delete występuje w kodzie trybu ścisłego, wywoływany jest błąd składni, jeśli jego UnaryExpression jest bezpośrednim odniesieniem do zmiennej, argumentu funkcji lub nazwy funkcji (11.4.1).
  • Po wystąpieniu operatora delete w kodzie trybu ścisłego, zostanie zgłoszony błąd TypeError, jeśli właściwość do usunięcia ma atrybut {[[Configurable]]: false} (11.4.1). Jest to błąd składniowy, jeśli wartość VariableDeclaration lub VariableDeclarationNoIn występuje w obrębie ścisłego kodu, a jej identyfikator to eval lub argumenty (12.2.1).
  • Kod trybu ścisłego może nie zawierać parametru WithStatement. Wystąpienie WithStatement w takim kontekście to SyntaxError (12.10).
  • Jest składniowy jeśli TryStatement w zaczep ma miejsce w ściśle kodu i identyfikator produkcji zapadka jest eval i argumentów (12.14.1)
  • Jest składniowy jeśli eval identyfikator i argumentów widoczny w FormalParameterList trybu ścisłego FunctionDeclaration lub FunctionExpression (13.1)
  • Funkcja trybu ścisłego może nie mieć dwóch lub więcej formalnych parametrów o tej samej nazwie. Próba utworzenia takiej funkcji za pomocą konstruktora FunctionDeclaration, FunctionExpression lub Function to SyntaxError (13.1, 15.3.2).
  • Implementacja nie może wykraczać poza zdefiniowane w niniejszej specyfikacji znaczenia w ramach funkcji trybu ścisłego właściwości o nazwie wywołujący lub argumenty funkcji instancji. Kod ECMAScript nie może tworzyć ani modyfikować właściwości o tych nazwach w obiektach funkcji, które odpowiadają funkcjom trybu ścisłego (10.6, 13.2, 15.3.4.5.3).
  • Jest to błąd składniowy do użycia w trybie ścisłym kod eval lub argumenty identyfikatorów jako identyfikator oświadczenia FunctionDeclaration lub FunctionExpression lub jako formalna nazwa parametru (13.1). Próba dynamicznego zdefiniowania takiej funkcji trybu ścisłego za pomocą konstruktora Function (15.3.2) spowoduje zgłoszenie wyjątku SyntaxError.
28

Jeden aspekt trybie ścisłym nie wspomniano w odpowiedzi Simona jest to, że tryb ścisły ustawia this do undefined w funkcji powołanych przez wywołania funkcji.

więc rzeczy takie jak ta

function Obj() { 
    this.a = 12; 
    this.b = "a"; 
    this.privilegedMethod = function() { 
     this.a++; 
     privateMethod(); 
    }; 

    function privateMethod() { 
    this.b = "foo"; 
    } 
} 

spowoduje błąd podczas privateMethod nazywa się (ponieważ nie można dodać obiekt do undefined), zamiast niepotrzebnie dodając właściwość b do globalnego obiektu.

+4

tak, trzeba dodać 'privateMethod.bind (this)();' i wywołać 'new' [' jsbin.com'] (https://jsbin.com/foyomo/edit?html,js,console) – hlcs

5

Tryb ścisły powoduje kilka zmian w normalnej semantyce JavaScript.

  • Tryb ścisły eliminuje niektóre błędy związane z cichym JavaScriptem, zmieniając je, aby wyświetlały błędy.

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

  • tryb ścisły zakazuje niektórych składni, które mogą być zdefiniowane w przyszłych wersjach ECMAScript.

1

ECMAScript5 wprowadza kilka nowych obiektów i właściwości, a także tzw "strict mode".

Tryb ścisły jest podzbiorem języka, który nie obejmuje przestarzałych funkcji.Surowy tryb jest opcjonalny i nie jest wymagany, co oznacza, że ​​jeśli chcesz, aby kod działał w trybie ścisłym , deklarujesz zamiar używając (raz na funkcję lub raz dla całego programu ) następującego ciągu:

"use strict"; 
6

ECMAScript 5 wprowadził pojęcie trybie ścisłym.

Wywoływanie trybie ścisłym w Kodeksie

Tryb ścisły dotyczy całych skryptów lub do poszczególnych funkcji. Nie ma zastosowania do instrukcji blokowej zawartej w nawiasach klamrowych {}, więc próba zastosowania jej w takich kontekstach nic nie robi.

cały skrypt:

powiedzmy kreujemy app.js więc dodanie pierwszej instrukcji użytkowania skrypt trybu ścisłego egzekwowania dla całego kodu.

// app.js whole script in strict mode syntax 
“use strict”; 
// Now you can start writing your code 

Tryb ścisły dla funkcji:

Aby wywołać tryb ścisły dla funkcji, należy umieścić dokładną instrukcję „use strict”; na początku treści funkcji przed jakimkolwiek innym stwierdzeniem.

function yourFunc(){ 
"use strict"; 

// Your function code logic 
} 

Tryb ścisły uwzględnia kilka zmian w normalnej semantyki Javascript. Pierwszy tryb ścisły eliminuje pewien cichy błąd JavaScript, zmieniając go, aby wyświetlał błędy.

na przykład: Kod użyciu trybie ścisłej

enter image description here

W powyższym przykładzie kodu bez użycia trybu ścisłego w kodzie nie wygeneruje błąd. Ponieważ uzyskujemy dostęp do zmiennej x bez jej deklarowania. Więc w trybie ścisłym dostęp do niezadeklarowanej zmiennej powoduje błąd.

Teraz spróbujmy uzyskać dostęp do zmiennej x bez deklarowania jej bez trybu ścisłego.

(function(){ 
    x = 3; 
})(); 

// Will not throw an error 

Zaletą korzystania z trybu ścisłego:

  • Wyeliminowanie błędów kodu JavaScript nieme rzucając błąd.
  • Naprawia błąd, który utrudnia silnikowi JavaScript wykonywanie optymalizacji.
  • Spraw, aby kod działał szybciej niż identyczny kod, który nie jest w trybie ścisłym.
  • Zakazuje jakiejś składni, która prawdopodobnie zostanie zdefiniowana w przyszłej wersji ECMAScript.
0

2017 i I w końcu znalazłem się w dokumentacji:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

Tryb ścisły jest sposób, aby zdecydować się na ograniczonej wariantu JavaScript. Tryb ścisły nie jest tylko podzbiorem: celowo ma inną semantykę od normalnego kodu. Przeglądarki, które nie obsługują trybu ścisłego, wykonają kod trybu ścisłego z innym zachowaniem niż przeglądarki, więc nie opierają się na trybie ścisłym bez sprawdzania cech, aby uzyskać wsparcie dla istotnych aspektów trybu ścisłego. Kod trybu ścisłego i kod nieostry mogą być współistniejące, więc skrypty mogą przejść do trybu ścisłego przyrostowo.


tryb Ścisłe powoduje szereg zmian w normalnych semantyki JavaScript. Po pierwsze, tryb ścisły eliminuje niektóre błędy cichej JavaScriptu o , zmieniając je, aby wyświetlały błędy. Po drugie, tryb ścisły naprawia błędy, które uniemożliwiają silnikom JavaScript wykonywanie optymalizacji: Kod trybu ścisłego może czasami być uruchamiany szybciej niż identyczny kod , który nie jest trybem ścisłym. Po trzecie, tryb ścisły uniemożliwia zdefiniowanie składni w przyszłych wersjach ECMAScript.

Powiązane problemy