Što znači "koristiti strogi" u JavaScriptu i koji su razlozi za to?

Nedavno sam pokrenuo svoj JavaScript kôd putem Crockford JSLinta i dao je sljedeću pogrešku:

Problem na liniji 1 znak 1: Nedostaje izraz "koristite strogi".

Dok sam radila neke pretrage, shvatila sam da neki ljudi dodaju "use strict"; u vašem javascript kodu. Čim sam dodao izraz, pogreška se prestala pojavljivati. Nažalost, Google nije otkrio većinu povijesti ove linije operatora. Naravno, ovo bi trebalo biti povezano s načinom na koji JavaScript tumači preglednik, ali ne znam kakav će biti učinak.

Dakle, što je "use strict"; je li sve o tome što ovo implicira, i je li još uvijek relevantno?

Svaki trenutni preglednik reagira na "use strict"; string ili je to za buduću uporabu?

6989
26 авг. postavila Mark Rogers 26 aug. 2009-08-26 19:10 '09 u 19:10 2009-08-26 19:10
@ 30 odgovora

Ovaj članak o Javascript Strict modu vas može zanimati: John Resig - ECMAScript 5 Strict Mode, JSON i drugo

Da citiram neke zanimljive dijelove:

Strogi način rada nova je značajka u ECMAScript 5 koja vam omogućuje da postavite program ili funkciju u "strogi" radni kontekst. Ovaj strogi kontekst sprječava poduzimanje određenih radnji i daje više iznimaka.

I također:

Strogi način pomaže na nekoliko načina:

  • Uhvaća neke uobičajene šifre za kodiranje, bacajući iznimke.
  • On sprječava ili stvara pogreške kada se poduzmu relativno "nesigurne" radnje (na primjer, dobivanje pristupa globalnom objektu).
  • To onemogućuje značajke koje su zbunjujuće ili loše osmišljene.

Također imajte na umu da možete primijeniti "strogi način" na cijelu datoteku ... Ili ga možete koristiti samo za određenu funkciju (koja još uvijek citira članak Johna Resiga):

 // Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code... 

Što može biti korisno ako trebate miješati stari i novi kôd ;-)

Pretpostavljam da je to malo slično "use strict" koji možete koristiti u Perlu (otuda i ime?): Pomaže vam da napravite manje grešaka pronalazeći više stvari koje mogu dovesti do kvarova.

Trenutno ga podržavaju svi glavni preglednici (IE 9 panel i ispod).

4587
26 авг. odgovor je dao Pascal MARTIN 26 aug. 2009-08-26 19:15 '09 u 19:15 2009-08-26 19:15

Ovo je nova značajka ECMAScripta 5. John Resig napisao je dobar sažetak .

To je samo redak koji stavljate u JavaScript datoteke (na vrhu datoteke ili unutar funkcije), što izgleda ovako:

border=0
 "use strict"; 

Omogućavanje ovog koda više ne bi trebalo uzrokovati probleme s trenutnim preglednicima jer je to samo niz znakova. To može uzrokovati probleme s vašim kodom u budućnosti ako vaš kôd prekine pragmu. Na primjer, ako trenutno imate foo = "bar" bez prvog definiranja foo , vaš će se kôd srušiti ... što je, po mom mišljenju, dobro.

1152
26 авг. odgovor je dan 26 aug. 2009-08-26 19:14 '09 u 19:14 2009-08-26 19:14

Izjava "use strict"; upućuje pregledniku da koristi strogi način rada, koji je smanjeni i sigurniji skup funkcija JavaScripta.

Popis funkcija (nije iscrpan)

  1. Onemogućava globalne varijable. (Uklanja nestale var deklaracije i tipkanje u nazivima varijabli)

  2. Tihi neuspjeli zadaci uzrokovat će pogrešku u strogom načinu rada (dodjeljujući NaN = 5; )

  3. Pokušaji uklanjanja svojstava otpornih na pogreške će uzrokovati ( delete Object.prototype )

  4. Zahtijeva da sva imena svojstava u objektu budu jedinstvena ( var x = {x1: "1", x1: "2"} )

  5. Nazivi parametara funkcije moraju biti jedinstveni ( function sum (x, x) {...} )

  6. Zabranjuje - oktalna sintaksa ( var x = 023; neki programeri pogrešno vjeruju da prethodna nula ne čini ništa za promjenu broja.)

  7. Zabranjeno with ključnom riječi

  8. eval u strogom načinu rada ne uvodi nove varijable

  9. Onemogući jednostavno brisanje imena ( delete x; )

  10. Onemogućavanje vezivanja ili imenovanja eval i arguments u bilo kojem obliku

  11. Strogi način rada ne podržava svojstva objekta arguments s formalnim parametrima. (tj. u function sum (a,b) { return arguments[0] + b;} Ovo radi jer su arguments[0] povezani s, itd.)

  12. arguments.callee nije podržan

[Veza: strogi način rada , Mozilla Developer Network]

567
25 нояб. odgovor je dao 25.11. 2014-11-25 00:22 '14 u 0:22 2014-11-25 00:22

Ako su ljudi zabrinuti zbog use strict , možete pogledati ovaj članak:

Podrška ECMAScript 5 Strict Mode u preglednicima. Što to znači?
NovoGeek.com - Krishnin blog

Govori o podršci preglednika, ali što je još važnije, kako se nositi s njom:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Odgovor daje Jamie Hutber 16. srpnja '12 u 2:25 am 2012-07-16 02:25

Riječ opreza, sve što programirate s tvrdim punjenjem: primjena "use strict" na postojeći kod može biti opasna! Ova stvar nije neka lijepa, sretna naljepnica koju možete staviti na kod kako bi ga "bolje". S "use strict" ispravnim "use strict" pragmama, preglednik iznenada baca iznimke u slučajnim mjestima koja nikada prije nisu bacili, jednostavno zato što na ovom mjestu radite ono što JavaScript dopušta default / free, ali ne kao strogi JavaScript ! Možda imate stroga kršenja koja su skrivena u rijetko korištenim pozivima za vaš kôd, koji će generirati iznimku samo kada se na kraju pokreću - recimo, u produkcijskom okruženju koje koriste klijenti za plaćanje!

Ako namjeravate poduzeti odlučujući korak, preporučujemo korištenje "use strict" uz sveobuhvatne testove jedinica i strogo konfiguriran JSHint zadatak izgradnje, koji će vam dati povjerenje da ne postoji tamni kut vašeg modula koji će eksplodirati jer ste uključili strogi način rada. Ili, hej, evo još jedne mogućnosti: samo nemojte "use strict" bilo koju od vaših zastarjelih kodova, ovo je vjerojatno sigurnije, poštenije. DEFINITIVNO NEMOJTE dodavati "use strict" za bilo koje module koji ne posjedujete ili ne podržavate, kao što su moduli treće strane.

Mislim da čak i ako je to smrtonosni želudac u kavezu, "use strict" može biti dobro, ali morate to učiniti kako treba. Najbolje vrijeme da krenete strogo je kada je vaš projekt novi i počnete od nule. Postavite JSHint/JSLint sa svim upozorenjima i opcijama sklopljenim koliko god vaš tim može trgnuti, dobiti dobar sustav za izgradnju / testiranje / odobravanje koji se može konfigurirati kao Grunt+Karma+Chai , a samo THEN će označiti sve vaše nove module kao "use strict" . Budite spremni izliječiti mnoge pogreške i upozorenja. Pobrinite se da svatko razumije gravitaciju postavljanjem sklopa na FAIL ako JSHint/JSLint uzrokuje nepravilnosti.

Moj projekt nije bio novi projekt kada sam usvojio "use strict" zahtjev "use strict" . Kao rezultat toga, moj IDE je pun crvenih oznaka, jer na polovici modula nemam "use strict" , a JSHint se žali na to. Ovo je podsjetnik na ono što bih trebao raditi u budućnosti. Moj cilj je da budem crvena oznaka za besplatno zbog svih mojih nestalih "use strict" izjava, ali to je bilo mnogo godina.

193
03 марта '14 в 10:37 2014-03-03 10:37 Odgovor daje DWoldrich 03. ožujka 2014. u 10:37 2014-03-03 10:37

Koristite 'use strict'; ne čini vaš kôd boljim.

Striktni JavaScript način je funkcija u ECMAScript 5 . Možete omogućiti strogi način tako što ćete to proglasiti na vrhu svoje skripte / funkcije.

 'use strict'; 

Kada JavaScript mehanizam vidi ovu direktivu, počet će interpretirati kod u posebnom načinu. U ovom načinu se pojavljuju greške kada se otkriju određene metode kodiranja koje mogu biti potencijalne pogreške (što je argument u korist strogog načina rada).

Razmotrite ovaj primjer:

 var a = 365; var b = 030; 

U svojoj opsesiji izgradnjom numeričkih literala, programer je nehotice inicijalizirao varijablu b osmom literalom. Ne-striktni način će to protumačiti kao numerički literal s vrijednošću 24 (u bazi 10). Međutim, strogi način rada uzrokovat će pogrešku.

Za neiscrpni popis specijaliteta u strogom načinu, pogledajte ovaj odgovor .


Gdje trebam upotrijebiti 'use strict'; ?

  • U mojoj novoj javascript aplikaciji: Apsolutno! Strogi način rada može se koristiti kao doušnik kada učinite nešto glupo s vašim kodom.

  • U mom postojećem javascript kodu: Vjerojatno ne! Ako vaš postojeći JavaScript kôd sadrži upute koje su zabranjene u strogom načinu rada, aplikacija će se jednostavno prekinuti. Ako vam je potreban strog način rada, trebali biste biti spremni za otklanjanje pogrešaka i popravljanje postojećeg koda. Zbog toga je upotreba 'use strict'; ne čini vaš kôd boljim.


Kako koristiti strogi mod?

  1. Umetnite 'use strict'; pri vrhu skripte:

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

    Napominjemo da će se sve u myscript.js tumačiti u strogom načinu rada.

  2. Ili zalijepite 'use strict'; Izjava iznad vašeg tijela funkcionira:

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

    Sve u leksičkom opsegu funkcije doSomething interpretirat će se u strogom načinu rada. Ovdje je važno leksičko područje riječi. Pogledajte ovaj odgovor za bolje objašnjenje.


Koje su stvari strogo zabranjene?

Našao sam dobar članak koji opisuje nekoliko stvari koje su strogo zabranjene (imajte na umu da ovo nije ekskluzivni popis):

volumen

Povijesno gledano, JavaScript je bio zbunjen o tome kako su funkcije pokrivene. Ponekad se čini da su statički zarobljeni, ali neke ih funkcije prisiljavaju da se ponašaju kao da su dinamički pokrivene područjem. To je zbunjujuće, što otežava čitanje i razumijevanje programa. Nesporazum uzrokuje pogreške. To je ujedno i problem izvedbe. Statička definicija domene omogućila bi varijablu vezanja tijekom kompiliranja, ali zahtjev za dinamičkom domenom znači da se vezanje mora odgoditi do vremena izvođenja, što je povezano sa značajnim smanjenjem performansi.

Strogi način rada zahtijeva da sve vezne varijable budu statički izvršene. To znači da funkcije koje su prethodno zahtijevale dinamičko povezivanje moraju biti eliminirane ili modificirane. Posebno je isključen operater sa, a sposobnost eval-funkcija da ometa okruženje pozivatelja strogo je ograničena.

Jedna od prednosti striktnog koda je da alati kao što je YUI Compressor mogu bolje raditi na obradi.

Implicirane globalne varijable

JavaScript podrazumijeva globalne varijable. Ako ne izričito deklarirate varijablu, globalna je varijabla implicitno deklarirana za vas. To pojednostavljuje programiranje za početnike jer mogu zanemariti neke od glavnih poslovnih zadataka. Ali to otežava upravljanje većim programima i značajno smanjuje pouzdanost. Dakle, u strogom načinu rada, implicirane globalne varijable više se ne stvaraju. Morate izričito navesti sve svoje varijable.

Globalno curenje

Postoje brojne situacije koje mogu uzrokovati this to povezano s globalnim objektom. Na primjer, ako ste zaboravili dati new prefiksom kada pozivate konstruktorsku funkciju, this će se konstruktor neočekivano povezati s globalnim objektom, pa će umjesto inicijalizacije novog objekta, tiho krivotvoriti s globalnim varijablama. U tim situacijama, striktni način umjesto toga povezuje this s undefined , što uzrokuje da konstruktor umjesto toga izbaci iznimku, dopuštajući joj da ranije otkrije pogrešku.

Bučna pogreška

JavaScript je uvijek imao svojstva samo za čitanje, ali ih niste mogli sami stvoriti sve dok funkcija Object.createProperty nije otvorena za Object.createProperty funkciju Object.createProperty . Ako ste pokušali dodijeliti vrijednost svojstvu samo za čitanje, neće uspjeti. Dodjela neće promijeniti vrijednost imovine, ali program će djelovati kao da je. To je opasnost od integriteta, što može dovesti do prijelaza programa u nekonzistentno stanje. U strogom načinu, pokušaj promjene svojstva samo za čitanje uzrokovat će iznimku.

oktalni

8-bitna zastupljenost brojeva bila je iznimno korisna pri izvođenju strojnog programiranja na strojevima čija je veličina riječi bila višestruka od 3. Kada radite s glavnim računalom CDC 6600, koji ima veličinu riječi od 60 bita, potreban vam je oktalni broj. Ako biste mogli čitati oktalni, možete pogledati riječ kao 20 znamenki. Dvije znamenke predstavljaju op kod, a jedna znamenka identificira jedan od 8 registara. Tijekom sporog prelaska s strojnih kodova na jezike visoke razine, smatralo se korisnim osigurati oktalne oblike u programskim jezicima.

U C je odabrana krajnje nesretna ideja oktalnosti: vodeća nula. Dakle, u C 0100 znači 64, a ne 100, a 08 je pogreška, a ne 8. Čak i više, nažalost, ovaj anakronizam je kopiran na gotovo sve suvremene jezike, uključujući JavaScript, gdje se koristi samo za stvaranje pogrešaka. To nema druge svrhe. Dakle, u strogom načinu, oktalni oblici više nisu dopušteni.

Isto tako

Argumenti pseudog niza postaju malo više nalik na nizove u ES5. U strogom načinu rada, gubi se callee i caller svojstva. To vam omogućuje da svoje arguments nepouzdanom kodu, ne ostavljajući puno povjerljivog konteksta. Osim toga, svojstva arguments funkcija su isključena.

U strogom načinu rada, duplicirani ključevi u funkciji doslovno daju sintaktičku pogrešku. Ne može funkcionirati ima dva parametra s istim imenom. Ne može funkcionirati ima varijablu s istim imenom kao jedan od njegovih parametara. Funkcija ne može delete ima svoje varijable. Pokušaj delete svojstva koje se ne može konfigurirati sada daje izuzetak. Primitivne vrijednosti nisu implicitno zamotane.


Rezervirane riječi za buduće verzije javascripta

ECMAScript 5 dodaje popis rezerviranih riječi. Ako ih koristite kao varijable ili argumente, strogi način generira pogrešku. Rezervirane riječi:

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


Daljnje čitanje

144
29 янв. odgovor dao sampathsris siječanj 29 2016-01-29 14:35 '16 u 14:35 2016-01-29 14:35

Preporučujem da svi programeri počnu koristiti strogi način rada. Postoji dovoljno preglednika koji ga podržavaju da će strogi način pravno pomoći da nas spasimo od pogrešaka za koje nismo ni znali da su u vašem kodu.

Očigledno, u početnoj fazi bit će pogrešaka koje nikada prije nismo susreli. Da bismo dobili punu korist, moramo provesti odgovarajuće testiranje nakon prebacivanja na strogi način kako bismo bili sigurni da smo svi uhvaćeni. Definitivno jednostavno ne use strict u našem kodeksu i vjerujemo da nema pogrešaka. Znači da je vrijeme da počnete koristiti ovu nevjerojatno korisnu jezičnu značajku za pisanje boljeg koda.

Na primjer

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

JSLint je program za otklanjanje pogrešaka koji je napisao Douglas Crockford. Samo ga zalijepite u svoju skriptu i brzo skenira sve vidljive probleme i pogreške u vašem kodu.

128
05 июля '13 в 22:38 2013-07-05 22:38 odgovor je dan Pank 05. srpnja 2013. u 10:38 2013-07-05 22:38

Želio bih ponuditi nešto utemeljeniji odgovor koji nadopunjuje ostale odgovore. Nadao sam se da ću urediti najpopularniji odgovor, ali nisam mogao. Pokušao sam ga učiniti što potpunijim i potpunijim.

Za više informacija, možete pogledati MDN dokumentaciju .

Direktiva "use strict" unesena je u ECMAScript 5.

Direktive su kao izjave, ali različite.

  • use strict ne sadrži ključne riječi: direktiva je izraz jednostavne izraze koji se sastoji od posebnog literalnog niza (u jednostrukim ili dvostrukim navodnicima). JavaScript motori koji ne implementiraju ECMAScript 5 jednostavno vide izraz bez popratnih efekata. Očekuje se da će buduće verzije ECMAScript standarda uvesti use kao pravu ključnu riječ; Tako će citati postati zastarjeli.
  • use strict može use strict samo na početku skripte ili funkcije, tj. mora prethoditi bilo kojoj drugoj (stvarnoj) izjavi. To ne bi trebala biti prva instrukcija u funkcijskom skripti: može joj prethoditi drugi operatorski izrazi koji se sastoje od string literala (i JavaScript implementacije se mogu promatrati kao direktive specifične za implementaciju). Literalni nizovi koji slijede prvi pravi operator (u skripti ili funkciji) jednostavni su izrazi. Tumači ih ne smiju tumačiti kao smjernice i nemaju učinka.

use strict smjernice ukazuju da je sljedeći kod (u skripti ili funkciji) strogi kod. Kod na najvišoj razini skripte (kod koji nije u funkciji) smatra se strogim kodom kada skripta sadrži use strict smjernice. Sadržaj funkcije smatra se strogim kodom kada je sama funkcija definirana u striktnom kodu ili kada funkcija sadrži use strict naredbu use strict . Kod koji se prosljeđuje metodi eval() smatra se strogim kodom kada se eval() poziva iz niza ili sadrži use strict direktivu o use strict .

ECMAScript 5 strogi način je ograničen podskup JavaScript jezika, koji eliminira odgovarajuće jezične nedostatke i osigurava strožu provjeru pogrešaka i povećanu sigurnost. Slijede razlike između strogog načina rada i normalnog načina rada (od kojih su prve tri posebno važne):

  • Ne možete ga koristiti with izjavom u strogom načinu rada.
  • U strogom modu, sve varijable moraju biti deklarirane: ako dodijelite vrijednost identifikatoru koji nije deklariran kao varijabla, funkcija, parametar funkcije, catch-clause parametar ili globalno svojstvo Object , dobit ćete ReferenceError . U normalnom načinu, identifikator je implicitno deklariran kao globalna varijabla (kao svojstvo globalnog Object )
  • В строгом режиме ключевое слово this имеет значение undefined функции, которые были вызываться как функции ( а не как методы). (В нормальном режиме this всегда указывает на глобальный Object ). Это различие можно использовать для проверки, поддерживает ли реализация строгий режим:
 var hasStrictMode = (function() { "use strict"; return this===undefined }()); 
  • Также, когда функция вызывается с call() или apply в строгом режиме, this точно значение первого аргумента call() или apply() . (В нормальном режиме null и undefined заменяются глобальным Object а значения, которые не являются объектами, преобразуются в объекты.)

  • В строгом режиме вы получите TypeError , когда вы пытаетесь назначить свойства readonly или определить новые свойства для не растяжимого объекта. (В обычном режиме оба просто обходятся без сообщения об ошибке.)

  • В строгом режиме при передаче кода в eval() вы не можете объявлять или определять переменные или функции в области вызывающего (как это можно сделать в обычном режиме). Вместо этого для eval() создается новая область, и переменные и функции находятся в пределах этой области. Эта область уничтожается после того, как eval() завершает выполнение.
  • В строгом режиме аргумент-объект функции содержит статическую копию значений, которые передаются этой функции. В нормальном режиме аргумент-объект имеет несколько "магическое" поведение: элементы массива и именованные функциональные параметры ссылаются на одно и то же значение.
  • В строгом режиме вы получите SyntaxError когда за оператором delete следует неквалифицированный идентификатор (переменная, функция или параметр функции). В нормальном режиме выражение delete ничего не сделает и будет оценено как false .
  • В строгом режиме вы получите TypeError при попытке удалить неконфигурируемое свойство. (В обычном режиме попытка просто терпит неудачу, а выражение delete - false ).
  • В строгом режиме это считается синтаксической ошибкой при попытке определить несколько свойств с тем же именем для литерала объекта. (В нормальном режиме ошибки нет.)
  • В строгом режиме это считается синтаксической ошибкой, когда объявление функции имеет несколько параметров с тем же именем. (В нормальном режиме ошибки нет.)
  • В строгом режиме не допускаются восьмеричные литералы (это литералы, начинающиеся с 0x . (В нормальном режиме некоторые реализации позволяют делать восьмеричные литералы).
  • В строгом режиме идентификаторы eval и arguments обрабатываются как ключевые слова. Вы не можете изменить их значение, не можете присвоить им значение, и вы не можете использовать их в качестве имен для переменных, функций, параметров функций или идентификаторов блока catch.
  • В строгом режиме больше ограничений на возможности проверки стека вызовов. arguments.caller и arguments.callee вызывают TypeError в функции в строгом режиме. Кроме того, некоторые свойства caller- и аргументы функций в строгом режиме вызывают TypeError при попытке их прочитать.
88
ответ дан Ely 15 мая '15 в 9:58 2015-05-15 09:58