Ką „naudokite griežtai“ „JavaScript“, ir kokios yra šios priežastys?

Neseniai pradėjau savo „JavaScript“ kodą „Crockford JSLint“ , ir ji pateikė šią klaidą:

1 problemos eilutės 1 problema: trūksta „naudoti griežtą“ pareiškimą.

Atlikdamas kai kurias paieškas supratau, kad kai kurie žmonės prideda "use strict"; jūsų „JavaScript“ kode. Kai tik pridėjau išraišką, klaida nustojo rodyti. Deja, „Google“ neatskleidė didžiosios šios operatoriaus linijos istorijos. Žinoma, tai turėtų būti susijusi su tuo, kaip naršyklė interpretuoja „JavaScript“, bet nežinau, koks bus poveikis.

Taigi, kas yra "use strict"; yra viskas, ką tai reiškia, ir ar ji vis dar aktuali?

Bet kokia dabartinė naršyklė atsako į "use strict"; ar ji naudojama ateityje?

6989
26 авг. nustatė Mark Rogers 26 rug. 2009-08-26 19:10 '09 19:10 2009-08-26 19:10
@ 30 atsakymų

Šis straipsnis apie „Javascript“ griežtą režimą gali jus dominti: John Resig - ECMAScript 5 griežtas režimas, JSON ir kt.

Norėdami cituoti keletą įdomių dalių:

Griežtas režimas yra nauja ECMAScript 5 funkcija, leidžianti programai ar funkcijai įdėti į „griežtą“ darbo aplinką. Šis griežtas kontekstas neleidžia imtis tam tikrų veiksmų ir išmeta daugiau išimčių.

Taip pat:

Griežtas režimas padeda keliais būdais:

  • Jis sugauna kai kuriuos bendruosius kodavimo žiedus.
  • Tai užkerta kelią ar sukelia klaidas, kai imamasi palyginti „nesaugių“ veiksmų (pavyzdžiui, pasiekiama prieiga prie pasaulinio objekto).
  • Tai neleidžia painioms ar prastai apgalvotoms funkcijoms.

Taip pat atkreipkite dėmesį, kad galite taikyti „griežtą režimą“ visam failui ... Arba galite jį naudoti tik tam tikrai funkcijai (dar nurodant John Resig straipsnį):

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

Kas gali būti naudinga, jei reikia maišyti seną ir naują kodą ;-)

Taigi manau, kad tai šiek tiek panašu į "use strict" kurį galite naudoti „Perl“ (taigi ir pavadinimas?): Tai padeda jums padaryti mažiau klaidų ieškant daugiau dalykų, kurie gali sukelti gedimus.

Šiuo metu ją palaiko visos pagrindinės naršyklės (IE 9 ir žemiau).

4587
26 авг. atsakymą pateikė Pascal MARTIN 26 rugpjūčio mėn. 2009-08-26 19:15 '09, 19:15, 2009-08-26 19:15

Tai nauja ECMAScript 5 funkcija. Johnas Resigas parašė gerą santrauką .

Tai tik linija, kurią įtraukėte į „JavaScript“ failus (failo viršuje arba funkcijos viduje), kuri atrodo taip:

border=0
 "use strict"; 

Įjungus šį kodą, nebebus problemų su dabartinėmis naršyklėmis, nes tai tik eilutė. Tai gali sukelti problemų, susijusių su jūsų kodu ateityje, jei jūsų kodas pragma. Pvz., Jei šiuo metu turite foo = "bar" nenurodydami foo , jūsų kodas užtruks ... kuris, mano nuomone, yra geras.

1152
26 авг. atsakymas pateikiamas 26 d. 2009-08-26 19:14 '09, 19:14 PM 2009-08-26 19:14

Pareiškimas "use strict"; nurodo naršyklei naudoti griežtą režimą, kuris yra sumažintas ir saugesnis „JavaScript“ funkcijų rinkinys.

Funkcijų sąrašas (neišsamus)

  1. Neleidžia pasaulinių kintamųjų. (Pašalina trūkstamas var deklaracijas ir kintamųjų pavadinimų rašmenis)

  2. Tyliai nepavykusios užduotys sukels klaidą griežtu režimu (priskiriant NaN = 5; )

  3. Bandymai pašalinti gedimui atsparias savybes sukels ( delete Object.prototype )

  4. Reikalaujama, kad visi objekto pavadinimai būtų pažodžiui unikalūs ( var x = {x1: "1", x1: "2"} )

  5. Funkcijų parametrų pavadinimai turi būti unikalūs ( function sum (x, x) {...} )

  6. Uždrausti - aštuntoji sintaksė ( var x = 023; kai kurie kūrėjai klaidingai mano, kad ankstesnis nulis nieko nekeičia.)

  7. Draudžiama with raktinį žodį

  8. eval griežtu režimu nenustato naujų kintamųjų

  9. Išjungti paprasto vardo ištrynimą ( delete x; )

  10. eval ir arguments eval ar pavadinimo išjungimas bet kokia forma

  11. Griežtas režimas nepalaiko arguments turinčių formalių parametrų, savybes. (t. y. function sum (a,b) { return arguments[0] + b;} Tai veikia, nes arguments[0] yra susiję su a ir tt)

  12. arguments.callee nepalaikomas

[Nuoroda: griežtas režimas , „Mozilla“ kūrėjų tinklas]

567
25 нояб. atsakymą pateikė gprasant . 2014-11-25 00:22 '14 ne 0:22 2014-11-25 00:22

Jei žmonės yra susirūpinę dėl use strict galite patikrinti šį straipsnį:

ECMAScript 5 griežto režimo palaikymas naršyklėse. Ką tai reiškia?
NovoGeek.com - Krišnos dienoraštis

Jame kalbama apie naršyklės palaikymą, bet dar svarbiau, kaip ją tvarkyti:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Atsakymą pateikė Jamie Hutber, liepos 16, 12 d., 2:25, 2012-07-16 02:25

Atsargumo žodis, viskas, ką programa su sunkiu įkrovimu: "use strict" esamam kodui gali būti pavojinga! Šis dalykas nėra kažkoks gražus, laimingas lipdukas, kurį galite patepti ant kodo, kad jis būtų „geresnis“. Su "use strict" teisingus "use strict" pragmas, naršyklė staiga išmeta išimtis atsitiktinėse vietose, kurių ji niekada nebuvo išmesta, paprasčiausiai todėl, kad šioje vietoje jūs darote tai, ką „JavaScript“ leidžia numatyti / nemokamai, bet ne kaip griežtą „JavaScript“ ! Gali būti, kad yra griežtų pažeidimų, kurie yra paslėpti retai naudojamais jūsų kodo skambučiais, o tai sukurs išimtį tik tada, kai jie bus paleisti - tarkim, gamybos aplinkoje, kurią naudoja jūsų mokėjimo klientai!

Jei ketinate imtis ryžtingų žingsnių, rekomenduojame naudoti "use strict" ir išsamius vieneto testus bei griežtai sukonfigūruotą „JSHint“ kūrimo užduotį, kuri suteiks jums pasitikėjimą, kad jūsų modulio tamsus kampas nebus sprogęs, nes įjungėte griežtą režimą. Arba, čia, dar vienas variantas: tiesiog "use strict" jokio pasenusio kodo, tai tikriausiai yra saugesnė, sąžiningesnė. GALI BŪTINA NĖRA "use strict" bet kuriems moduliams, kurių neturite, arba palaikyti, pvz., Trečiosios šalies modulius.

Manau, kad net jei jis yra mirtinas skrandis narve, "use strict" gali būti gera, bet jūs turite tai padaryti teisingai. Geriausias laikas eiti griežtai, kai jūsų projektas yra naujas ir pradedate nuo nulio. Nustatykite „ JSHint/JSLint su visais įspėjimais ir galimybėmis, kurios yra JSHint/JSLint , kaip jūsų komanda gali nugalėti, gaukite gerą statymo / bandymo / patvirtinimo sistemą, kuri gali būti sukonfigūruota kaip „ Grunt+Karma+Chai , ir tik tada visi nauji moduliai bus pažymėti kaip "use strict" . Būkite pasirengę išgydyti daug klaidų ir įspėjimų. Įsitikinkite, kad kiekvienas supranta sunkumą nustatydamas surinkimą į FAIL, jei JSHint/JSLint sukelia bet kokius pažeidimus.

Mano projektas nebuvo naujas projektas, kai patvirtinau "use strict" . Kaip rezultatas, mano IDE yra pilnas raudonų ženklų, nes pusėje mano modulių neturiu "use strict" , o JSHint skundžiasi. Tai man priminimas apie tai, ką turėčiau atlikti ateityje. Mano tikslas yra būti raudonas ženklas nemokamai, nes visi mano trūkstami "use strict" pareiškimus, tačiau tai jau daugelį metų.

193
03 марта '14 в 10:37 2014-03-03 10:37 Atsakymą pateikė DWoldrich kovo 3 d. 14 d. 10:37 2014-03-03 10:37

Naudokite 'use strict'; nesukuria jūsų kodo geriau.

Griežtas „JavaScript“ režimas yra funkcija ECMAScript 5 . Gali būti įjungtas griežtas režimas, nurodydamas tai savo scenarijaus / funkcijos viršuje.

 'use strict'; 

Kai „JavaScript“ variklis mato šią direktyvą, jis pradės interpretuoti kodą specialiu režimu. Šiame režime atsiranda klaidų, kai aptinkami tam tikri kodavimo metodai, kurie gali būti galimos klaidos (tai yra argumentas griežtam režimui).

Apsvarstykite šį pavyzdį:

 var a = 365; var b = 030; 

Savo įsakyme sukurti skaitmeninius skaitinius, kūrėjas netyčia inicijavo kintamąjį b aštuntuoju gramatiniu. Ne griežtas režimas tai interpretuos kaip skaitinį skaitinį, kurio vertė yra 24 (10 bazėje). Tačiau griežtas režimas sukels klaidą.

Norėdami gauti išsamų specialių produktų sąrašą griežtu režimu, žr.


Kur turėčiau naudoti 'use strict'; ?

  • Mano naujojoje „JavaScript“ programoje: Absoliučiai! Griežtas režimas gali būti naudojamas kaip informatorius, kai darote kažką kvailo su kodu.

  • Mano esamo javascript kodo: tikriausiai ne! Jei jūsų esamame „JavaScript“ kode yra nurodymų, kurie yra draudžiami griežtu režimu, programa tiesiog pertrauka. Jei jums reikia griežto režimo, turėtumėte būti pasirengę derinti ir ištaisyti esamą kodą. Štai kodėl 'use strict'; nesukuria jūsų kodo geriau.


Kaip naudoti griežtą režimą?

  1. Įterpti 'use strict'; scenarijaus viršuje:

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

    Atminkite, kad viskas, kas yra „ myscript.js bus aiškinama griežtai.

  2. Arba įklijuokite 'use strict'; Pareiškimas virš jūsų kūno funkcijų:

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

    Viskas, kas yra doSomething funkcijos doSomething bus aiškinama griežtai. Čia svarbi žodžio leksinė sritis. Jei norite gauti geresnį paaiškinimą, žr. Šį atsakymą .


Kokie dalykai yra griežtai draudžiami?

Radau gerą straipsnį, kuriame aprašyti keli dalykai, kurie yra griežtai draudžiami (atkreipkite dėmesį, kad tai nėra išskirtinis sąrašas):

Tomas

Istoriškai „JavaScript“ buvo painiojama dėl funkcijų taikymo. Kartais atrodo, kad jie yra statiškai užfiksuoti, tačiau kai kurios funkcijos verčia juos elgtis taip, lyg jie dinamiškai dengtų regioną. Tai paini, todėl sunku skaityti ir suprasti programas. Nesusipratimai sukelia klaidų. Tai taip pat yra našumo problema. Statinis domeno apibrėžimas leistų nustatyti kintamojo susiejimą kompiliavimo metu, tačiau reikalavimas dinamiškam domenui reiškia, kad privalomasis ryšys turi būti atidėtas iki vykdymo, kuris yra susijęs su reikšmingu našumo sumažėjimu.

Griežtas režimas reikalauja, kad visos kintamos jungtys būtų statiškai įvykdytos. Tai reiškia, kad funkcijos, kurios anksčiau reikalavo dinaminio susiejimo, turi būti pašalintos arba pakeistos. Konkrečiai, operatorius, kuriam netaikoma, yra griežtai ribotas, o eval-funkcijų gebėjimas kištis į savo skambinančiojo aplinką.

Vienas iš griežto kodo privalumų yra tas, kad tokie įrankiai kaip „ YUI Compressor“ gali geriau apdoroti.

Numatomi pasauliniai kintamieji

„JavaScript“ reiškia pasaulinius kintamuosius. Jei aiškiai nenurodote kintamojo, pasaulinis kintamasis yra netiesiogiai paskelbtas jums. Tai supaprastina naujokų programavimą, nes jie gali ignoruoti kai kurias jų pagrindines verslo užduotis. Tačiau tai apsunkina didesnių programų valdymą ir gerokai sumažina patikimumą. Taigi griežtuoju režimu netiesioginiai pasauliniai kintamieji nebėra sukurti. Turite aiškiai deklaruoti visus savo kintamuosius.

Pasaulinis nuotėkis

Yra keletas situacijų, dėl kurių this būti susieta su pasauliniu objektu. Pavyzdžiui, jei pamiršote suteikti new prefiksu, kai skambinate konstruktoriaus funkcijai, this konstruktorius netikėtai susietas su pasauliniu objektu, todėl vietoj to, kad inicijuotų naują objektą, jis tyliai suklastotų su pasauliniais kintamaisiais. Esant tokioms situacijoms, griežtas režimas tai susieja su undefined , todėl konstruktorius vietoj to išmeta išimtį, leidžiant jam aptikti klaidą anksčiau.

Triukšminga klaida

„JavaScript“ visada turėjo tik skaitymo savybes, bet jūs negalėjote jas sukurti, kol funkcija Object.createProperty yra Object.createProperty atidaryta funkcija Object.createProperty . Jei bandėte priskirti reikšmę tik skaitymui, tai nepavyks. Užduotis nekeičia turto vertės, bet jūsų programa veiks taip, tarsi ji būtų. Tai yra vientisumo pavojus, kuris gali lemti programų perėjimą prie nenuoseklios valstybės. Griežtuoju režimu bandymas keisti tik skaitymo savybę sukels išimtį.

aštuoni

8 bitų skaičiavimų skaičius buvo labai naudingas atliekant mašinų programavimą mašinose, kurių žodis buvo 3 kartotinis. Dirbdami su CDC 6600 mainframe, kurio žodis yra 60 bitų, reikėjo aštuntojo numerio. Jei galėtumėte perskaityti aštuntą, galite žiūrėti į žodį kaip 20 skaitmenų. Du skaitmenys parodė op kodą, o vienas skaitmuo - vieną iš 8 registrų. Per lėtą perėjimą nuo mašinų kodų į aukšto lygio kalbas, buvo manoma, kad programavimo kalbomis buvo naudinga pateikti oktalo formas.

C buvo pasirinkta labai gaila oktalumo idėja: pirmasis nulis. Taigi C 0100 reiškia 64, o ne 100, o 08 yra klaida, o ne 8. Deja, šis anachronizmas buvo nukopijuotas į beveik visas šiuolaikines kalbas, įskaitant „JavaScript“, kur jis naudojamas tik klaidoms sukurti. Tai neturi kito tikslo. Taigi griežtu režimu oktalų formos nebeleidžiamos.

Et cetera

Pseudo masyvo argumentai tampa šiek tiek labiau panašūs į ES5 masyvus. callee režimu jis praranda callee ir caller savybes. Tai leidžia perduoti savo arguments nepatikimam kodui, nepaliekant daug konfidencialių aplinkybių. Be to, neįtraukiami funkcijų savybių arguments .

Griežtame režime dukart raktinių žodžių simboliai suteikia sintaksės klaidą. Funkcija negali veikti dviem to paties pavadinimo parametrais. Neįmanoma funkcija turi kintamąjį, turintį tą patį pavadinimą kaip ir vienas iš jo parametrų. Negalima delete funkcijos turi savo kintamuosius. Bandymas delete nekonfigūruojamą turtą dabar išskiria. Primityviosios vertės nėra netiesiogiai suvyniotos.


Rezervuoti žodžiai būsimoms „JavaScript“ versijoms

ECMAScript 5 prideda rezervuotų žodžių sąrašą. Jei juos naudosite kaip kintamuosius ar argumentus, griežtas režimas sukurs klaidą. Rezervuoti žodžiai:

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


Tolesnis skaitymas

144
29 янв. atsakymas, kurį pateikė sampathsris Jan 29 2016-01-29 14:35 '16 at 14:35 2016-01-29 14:35

Aš primygtinai rekomenduoju visiems kūrėjams pradėti taikyti griežtą režimą. Yra pakankamai naršyklių, palaikančių tai, kad griežtas režimas teisiškai padės mums išgelbėti nuo klaidų, kurių mes net nežinojome jūsų kode.

Matyt, pradiniame etape bus klaidų, su kuriomis anksčiau niekada nesusidūrėme. Norint gauti visapusišką naudą, turime pereiti prie griežto režimo, kad įsitikintume, jog visi sugauti. Tikrai, mes paprasčiausiai use strict kodo ir tikime, kad nėra klaidų. Taigi churnas yra laikas pradėti naudoti šią neįtikėtinai naudingą kalbos funkciją, kad parašytumėte geresnį kodą.

Pavyzdžiui

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

„JSLint“ yra „Douglas Crockford“ parašytas debugger. Tiesiog įklijuokite jį į savo scenarijų ir greitai nuskaitykite bet kokias pastebimas jūsų kodo problemas ir klaidas.

128
05 июля '13 в 22:38 2013-07-05 22:38 atsakymas pateikiamas Bankui liepos 5 d. 13 d. 10:38 2013-07-05 22:38

Norėčiau pasiūlyti šiek tiek pagrįstesnį atsakymą, kuris papildytų kitus atsakymus. Tikėjausi redaguoti populiariausią atsakymą, bet negalėjau. Bandžiau padaryti kuo išsamesnį ir išsamesnį.

Daugiau informacijos rasite MDN dokumentacijoje .

"use strict" direktyvą, įtrauktą į ECMAScript 5.

Direktyvos yra panašios, tačiau skirtingos.

  • use strict vartojimas neturi raktinių žodžių: direktyva yra paprasta išraiška, kuri susideda iš specialios eilutės (viena arba dvigubos kabutės). „JavaScript“ varikliai, kurie neįgyvendina ECMAScript 5, tiesiog mato išraišką be šalutinio poveikio. Tikimasi, kad būsimos ECMAScript standartų versijos bus use kaip tikras raktinis žodis; Taigi, citatos pasenks.
  • use strict galima use strict tik scenarijaus ar funkcijos pradžioje, t.y. turi būti prieš bet kokį kitą (realų) pareiškimą. Tai neturėtų būti pirmasis funkcijų scenarijaus nurodymas: prieš jį gali būti pateikiamos kitos operatoriaus išraiškos, sudarytos iš styginių literatūros (ir „JavaScript“ diegimas gali būti vertinamas kaip konkrečios įgyvendinimo direktyvos). Styginių literatūros, kurios atitinka pirmąjį tikrąjį operatorių (scenarijuje ar funkcijoje), yra paprastos išraiškos. Vertėjai neturėtų aiškinti jų kaip direktyvų ir neturi jokio poveikio.

use strict direktyvą nurodo, kad šis kodas (scenarijuje ar funkcijoje) yra griežtas kodas. Kodas aukščiausiu scenarijaus lygiu (kodas, kuris nėra funkcijoje) laikomas griežtu kodu, kai scenarijuje yra use strict use strict direktyva. Funkcijos turinys laikomas griežtu kodu, kai pati funkcija apibrėžiama griežtu kodu arba kai funkcija apima use strict direktyvą. eval() metodui perduotas kodas laikomas griežtu kodu, kai eval() yra vadinamas iš eilės kodo arba jame yra use strict direktyva.

„ECMAScript 5“ griežtas režimas yra ribotas „JavaScript“ kalbos pogrupis, kuris pašalina atitinkamus kalbos trūkumus ir suteikia griežtesnį klaidų tikrinimą ir padidintą saugumą. Toliau pateikiami skirtumai tarp griežto režimo ir įprastinio režimo (pirmieji trys yra ypač svarbūs):

  • Negalite jo naudoti with griežtu režimu.
  • Griežtuoju režimu turi būti deklaruojami visi kintamieji: jei priskiriate reikšmę identifikatoriui, kuris nebuvo deklaruotas kaip kintamasis, funkcija, funkcijos parametras, gaudymo sąlygos parametras arba visuotinis Object turinys, tada gausite „ ReferenceError . Įprastu režimu identifikatorius netiesiogiai skelbiamas kaip pasaulinis kintamasis (kaip visuotinio Object nuosavybė)
  • В строгом режиме ключевое слово 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