border=0

Wat doet "strict gebruiken" in JavaScript, en wat zijn de redenen hiervoor?

On>JSLint en deze gaf de volgende foutmelding:

Probleem bij regel 1-teken 1: ontbrekende instructie "strikt gebruiken".

Tijdens het uitvoeren van een aantal zoekopdrachten, realiseerde ik me dat sommige mensen "use strict"; in je javascript-code. Zodra ik een uitdrukking heb toegevoegd, is de fout niet meer weergegeven. Helaas heeft Google het grootste deel van de geschiedenis van deze operatorlijn niet onthuld. Dit zou natuurlijk gerelateerd moeten zijn aan de manier waarop JavaScript wordt geïnterpreteerd door de browser, maar ik weet niet wat het effect zal zijn.

Dus, wat is "use strict"; Gaat alles over wat dit inhoudt en is het nog steeds relevant?

Elke huidige browser reageert op "use strict"; string of is het voor toekomstig gebruik?

6989
26 авг. ingesteld door Mark Rogers 26 aug. 2009-08-26 19:10 '09 om 19:10, 2009-08-26 19:10
@ 30 antwoorden

Dit artikel over Javascript Strict-modus kan je interesseren: John Resig - ECMAScript 5 Strict-modus, JSON en meer

Om enkele interessante delen aan te halen:

Strikte modus is een nieuwe functie in ECMAScript 5 waarmee u een programma of functie in een "strikte" werkcontext kunt plaatsen. Deze strikte context voorkomt dat bepaalde acties worden ondernomen en werpt meer uitzonderingen op.

En ook:

Strikte modus helpt op verschillende manieren:

  • Hij vangt enkele veelvoorkomende codes voor bloopers en werpt uitzonderingen.
  • Het voorkomt of creëert fouten wanneer relatief "onveilige" acties worden ondernomen (bijvoorbeeld toegang verkrijgen tot een globaal object).
  • Hiermee worden functies uitgeschakeld die verwarrend of slecht doordacht zijn.

Merk ook op dat je "strict mode" op het volledige bestand kunt toepassen ... Of je kunt het alleen voor een specifieke functie gebruiken (nog steeds het artikel van John Resig citerend):

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

Wat kan handig zijn als je oude en nieuwe code moet mixen ;-)

Dus ik veronderstel dat het een beetje lijkt op "use strict" je kunt gebruiken in Perl (vandaar de naam?): Het helpt je om minder fouten te maken door meer dingen te vinden die tot storingen kunnen leiden.

Momenteel wordt het ondersteund door alle be> (IE 9-paneel en lager).

4587
26 авг. het antwoord wordt gegeven door Pascal MARTIN 26 aug. 2009-08-26 19:15 '09 om 19:15, 2009-08-26 19:15

Dit is een nieuw kenmerk van ECMAScript 5. John Resig heeft een goede samenvatting geschreven .

Dit is slechts een regel die u in uw JavaScript-bestanden plaatst (bovenaan uw bestand of binnen een functie), die er als volgt uitziet:

 "use strict"; 

Het inschakelen van deze code zou niet >foo = "bar" zonder eerst foo definiëren, zal uw code beginnen te crashen ... wat naar mijn mening goed is.

1152
26 авг. het antwoord wordt gegeven 26 augustus. 2009-08-26 19:14 '09 om 19:14 uur 2009-08-26 19:14

De verklaring "use strict"; instrueert de browser om de Strict-modus te gebruiken, wat een gereduceerde en veiliger reeks JavaScript-functies is.

Lijst met functies (niet-limitatief)

  1. Staat globale variabelen niet toe. (Verwijdert ontbrekende var verklaringen en typfouten in namen van variabelen)

  2. Stille mislukte taken veroorzaken een fout in de strikte modus (toewijzing van NaN = 5; )

  3. Pogingen om fouttolerante eigenschappen te verwijderen, veroorzaken ( delete Object.prototype )

  4. Vereist dat alle eigenschapsnamen in het letterlijke object uniek moeten zijn ( var x = {x1: "1", x1: "2"} )

  5. Functieparameternamen moeten uniek zijn ( function sum (x, x) {...} )

  6. Verboden - octaalsyntaxis ( var x = 023; sommige ontwikkelaars denken ten onrechte dat de vorige nul niets doet om het aantal te wijzigen).

  7. Verbied with trefwoord

  8. eval in strikte modus introduceert geen nieuwe variabelen

  9. Deactiveer eenvoudige naamverwijdering ( delete x; )

  10. Binding of naamgeving van eval en arguments in welke vorm dan ook uitschakelen

  11. Strikte modus biedt geen ondersteuning voor de eigenschappen van het object arguments met formele parameters. (d.w.z. in function sum (a,b) { return arguments[0] + b;} Dit werkt omdat arguments[0] zijn gekoppeld, etc.)

  12. arguments.callee niet ondersteund

[Link: Strict Mode , Mozilla Developer Network]

567
25 нояб. het antwoord wordt gegeven door gprasant 25 nov. 2014-11-25 00:22 '14 om 0:22 2014-11-25 00:22

Als mensen zich zorgen maken over use strict , is het de moeite waard dit artikel te lezen:

Ondersteuning voor ECMAScript 5 Strict-modus in browsers. Wat betekent dit?
NovoGeek.com - Krishna's Blog

Er wordt gesproken over browserondersteuning, maar wat nog be>

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 het antwoord wordt gegeven door Jamie Hutber 16 juli '12 om 2:25 2012-07-16 02:25

Een waarschuwing, alles wat u programmeert met hard charging: het toepassen van "use strict" op bestaande code kan gevaarlijk zijn! Dit item is geen leuke, vrolijke sticker die je op de code kunt kloppen om deze 'beter' te maken. Met "use strict" correcte "use strict" pragma's, werpt de browser plotseling uitzonderingen op willekeurige plaatsen die hij nog nooit eerder heeft gegooid, gewoon omdat je in deze plaats doet wat JavaScript toestaat voor standaard / gratis, maar niet zoals strikt JavaScript ! U kunt strenge schendingen hebben die verborgen zijn in zelden gebruikte oproepen naar uw code, die alleen een uitzondering genereren wanneer ze uiteindelijk actief zijn - bijvoorbeeld in een productieomgeving die uw betalingsklanten gebruiken!

Als u een beslissende stap wilt nemen, raden we aan om "use strict" samen met uitgebreide unit tests en een strikt geconfigureerde JSHint build-taak, die u vertrouwen geeft dat er geen donkere hoek van uw module is die slecht zal ontploffen omdat u de strikte modus hebt ingeschakeld. Of, hé, hier is nog een andere optie: voeg "use strict" aan uw verouderde codes, dit is waarschijnlijk veiliger en eerlijker. ZEKER GEEN "use strict" voor modules die u niet bezit of ondersteunt, zoals modules van derden.

Ik denk dat zelfs als het een dodelijke maag in een kooi is, "use strict" kan zijn, maar je moet het goed doen. De beste tijd om streng te werk te gaan, is wanneer uw project nieuw is en u helemaal opnieuw begint. Stel JSHint/JSLint met alle waarschuwingen en parameters die zo veel gevouwen zijn als uw team kan huiveren, verkrijg een goed build / test / goedkeuringssysteem dat kan worden geconfigureerd zoals Grunt+Karma+Chai , en alleen DAN zal al uw nieuwe modules markeren als "use strict" . Wees voorbereid om vele fouten en waarschuwingen te verhelpen. Zorg ervoor dat iedereen de zwaartekracht begrijpt door de assembly op FAIL in te stellen als JSHint/JSLint onregelmatigheden veroorzaakt.

Mijn project was geen nieuw project toen ik "use strict" adopteerde. Als gevolg daarvan zit mijn IDE vol met rode cijfers, omdat ik de helft van mijn modules niet "use strict" , en JSHint klaagt erover. Dit is een herinnering aan wat refactoring ik in de toekomst zou moeten doen. Mijn doel is om gratis een rode markering te zijn vanwege al mijn ontbrekende "use strict" uitspraken, maar dit is al vele jaren zo.

193
03 марта '14 в 10:37 2014-03-03 10:37 Antwoord wordt gegeven door DWoldrich op 03 maart '14 om 10:37 2014-03-03 10:37

Gebruik 'use strict'; Maak je code niet beter.

Strikte JavaScript-modus is een functie in ECMAScript 5 . U kunt de strikte modus inschakelen door dit aan de bovenkant van uw script / functie te declareren.

 'use strict'; 

Wanneer de JavaScript-engine deze richtlijn ziet, begint deze de code in een speciale modus te interpreteren. In deze modus treden fouten op wanneer bepaalde coderingsmethoden worden gedetecteerd die mogelijk fouten zijn (wat een argument is ten gunste van de strikte modus).

Beschouw dit voorbeeld:

 var a = 365; var b = 030; 

In zijn obsessie om numerieke literals te bouwen, initialiseerde de ontwikkelaar per ongeluk de variabele b achtste letterlijke. Een niet-strikte modus zal dit interpreteren als een numerieke letterlijke waarde met een waarde van 24 (in basis 10). De strikte modus veroorzaakt echter een fout.

Zie Dit antwoord voor een niet-volledige lijst met specialiteiten in de strikte modus.


Waar moet ik 'use strict'; ?

  • In mijn nieuwe javascript-app: Absoluut! De strikte modus kan als informant worden gebruikt als je iets stoms doet met je code.

  • In mijn bestaande javascript-code: waarschijnlijk niet! Als er instructies in uw bestaande JavaScript-code zijn die verboden zijn in de strikte modus, breekt de toepassing gewoon. Als u een strikte modus nodig hebt, moet u klaar zijn om te debuggen en bestaande code te repareren. Dat is de reden waarom het gebruik van 'use strict'; Maak je code niet beter.


Hoe de strikte modus te gebruiken?

  1. Voeg 'use strict'; aan de bovenkant van je script:

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

    Merk op dat alles in het bestand myscript.js in strikte modus wordt geïnterpreteerd.

  2. Of plak 'use strict'; De verklaring boven je lichaamsfuncties:

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

    Alles in de lexicale reikwijdte van de functie doSomething zal in strikte modus worden geïnterpreteerd. Het lexicale gedeelte van het woord is hier be>dit antwoord voor een betere uitleg.


Welke dingen zijn ten strengste verboden?

Ik vond een goed artikel dat verschillende dingen beschrijft die strikt verboden zijn (merk op dat dit geen exclusieve lijst is):

volume

JavaScript is van oudsher verward over de manier waarop functies worden gedekt. Soms lijken ze statisch bedekt, maar sommige functies dwingen hen zich te gedragen alsof ze dynamisch door een regio worden bedekt. Dit is verwarrend, waardoor het lezen en begrijpen van programma's moeilijk wordt. Misverstand veroorzaakt fouten. Dit is ook een prestatieprobleem. Een statische domeindefinitie zou een variabele binding mogelijk maken tijdens de compilatie, maar de vereiste voor een dynamisch domein betekent dat de binding moet worden uitgesteld tot aan runtime, wat gepaard gaat met een aanzienlijke prestatiedaling.

Strict-modus vereist dat alle variabele bindingen statisch worden uitgevoerd. Dit betekent dat functies die eerder dynamische koppeling vereisten, moeten worden geëlimineerd of gewijzigd. Met name de operator met is uitgesloten en het vermogen van EVAL-functies om de omgeving van de beller te verstoren is strikt beperkt.

Een van de voordelen van strikte code is dat tools zoals YUI Compressor beter kunnen werken aan de verwerking ervan.

Impliciete globale variabelen

JavaScript impliceert globale variabelen. Als u een variabele niet expliciet declareert, wordt een globale variabele impliciet voor u gedeclareerd. Dit vereenvoudigt het programmeren voor beginners, omdat ze sommige van hun be>

Wereldwijde lekken

Er zijn een aantal situaties waarbij this worden geassocieerd met een globaal object. Als u bijvoorbeeld vergeet het new voorvoegsel nieuw te maken wanneer u een constructorfunctie aanroept, wordt de constructor onverwacht gekoppeld aan een globaal object, dus in plaats van een nieuw object te initialiseren, wordt het in plaats daarvan gefalsifieerd met globale variabelen. In deze situaties bindt de strikte modus in plaats daarvan this met undefined , waardoor de constructor in plaats daarvan een uitzondering werpt, waardoor deze de fout eerder kan detecteren.

Noisy bug

JavaScript had altijd alleen-lezen-eigenschappen, maar je kon ze niet zelf maken tot de Object.createProperty functie Object.createProperty geopend voor de Object.createProperty functie. Als u probeert een waarde aan een alleen-lezen-eigenschap toe te wijzen, mislukt deze. De toewijzing zal de waarde van het onroerend goed niet veranderen, maar uw programma zal werken alsof het is. Dit is een gevaar voor integriteit, wat ertoe kan leiden dat programma's in een inconsistente toestand terechtkomen. In de strikte modus veroorzaakt een poging om de alleen-lezen-eigenschap te wijzigen een uitzondering.

octaal

De 8-bits weergave van getallen was uiterst nuttig bij het programmeren van machines op machines waarvan de woordgrootte een veelvoud van 3 was. Bij het werken met een CDC 6600-mainframe met een woordgrootte van 60 bits, had u een octaal getal nodig. Als je octaal zou kunnen lezen, zou je het woord als 20 cijfers kunnen beschouwen. Twee cijfers vertegenwoordigden de op-code en één cijfer identificeerde een van de 8 registers. Tijdens de trage overgang van machinecodes naar talen op hoog niveau werd het als nuttig beschouwd om octale formulieren in programmeertalen te leveren.

In C werd het uiterst ongelukkige concept van octaliteit gekozen: de voorloopnul. Dus in C 0100 betekent dit 64, niet 100, en 08 is een fout, niet 8. Meer nog, helaas is dit anachronisme gekopieerd naar bijna alle moderne talen, inclusief JavaScript, waar het alleen wordt gebruikt om fouten te maken. Dit heeft geen ander doel. Dus, in strikte modus, zijn octale vormen niet >

Et cetera

De pseudo-array-argumenten worden een beetje meer als arrays in ES5. In strikte modus verliest het de callee en caller eigenschappen. Hiermee kunt u uw arguments doorgeven arguments onbetrouwbare code, zonder veel vertrouwelijke context te verlaten. Bovendien is de eigenschap arguments van functies uitgesloten.

In strikte modus geven dubbele sleutels in een letterlijke functie een syntaxisfout. De can not function heeft twee parameters met dezelfde naam. De can not function heeft een variabele met dezelfde naam als een van zijn parameters. De functie Kan niet delete heeft zijn eigen variabelen. Als delete probeert delete niet-configureerbare eigenschap te delete nu een uitzondering gegenereerd. Primitieve waarden worden niet impliciet ingepakt.


Gereserveerde woorden voor toekomstige versies van javascript

ECMAScript 5 voegt een lijst met gereserveerde woorden toe. Als u ze als variabelen of argumenten gebruikt, genereert de strikte modus een fout. Gereserveerde woorden:

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


Verder lezen

144
29 янв. antwoord gegeven door sampathsris op 29 januari 2016-01-29 14:35 '16 om 14:35 2016-01-29 14:35

Ik raad ten zeerste aan dat alle ontwikkelaars de strikte modus gaan gebruiken. Er zijn voldoende browsers die dit ondersteunen, dat de strikte modus wettelijk helpt ons te redden van fouten waarvan we niet eens wisten dat ze in uw code zaten.

Blijkbaar zullen er in de beginfase fouten zijn die we nog nooit zijn tegengekomen. Om het volledige voordeel te krijgen, moeten we de juiste tests uitvoeren nadat we zijn overgeschakeld naar de strikte modus om te zorgen dat we allemaal worden gepakt. Zeker, we gebruiken eenvoudigweg geen use strict in onze code en zijn van mening dat er geen fouten zijn. Dus de churn is dat het tijd is om deze ongelooflijk nuttige taalfunctie te gaan gebruiken om betere code te schrijven.

Bijvoorbeeld

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

JSLint is een debugger geschreven door Douglas Crockford. Plak het gewoon in uw script en het zoekt snel naar merkbare problemen en fouten in uw code.

128
05 июля '13 в 22:38 2013-07-05 22:38 het antwoord wordt gegeven aan Pank op 05 juli '13 om 10:38 2013-07-05 22:38

Ik zou graag een iets meer onderbouwd antwoord willen bieden dat de andere antwoorden aanvult. Ik hoopte het meest populaire antwoord te kunnen bewerken, maar dat lukte niet. Ik heb geprobeerd het zo compleet en compleet mogelijk te maken.

Voor meer informatie, kunt u de MDN-documentatie raadplegen .

"use strict" -richtlijn ingevoerd in ECMAScript 5.

Richtlijnen zijn zoals verklaringen, maar verschillend.

  • use strict bevat geen trefwoorden: een richtlijn is een eenvoudige uitdrukkingszin die bestaat uit een speciale letterlijke tekenreeks (in enkele of dubbele aanhalingstekens). JavaScript-engines die ECMAScript 5 niet implementeren, zien eenvoudig een uitdrukking zonder bijwerkingen. Toekomstige versies van ECMAScript-normen zullen naar verwachting het use als een echt sleutelwoord introduceren; Aldus worden citaten overbodig.
  • use strict kan alleen worden gebruikt aan het begin van een script of functie, d.w.z. moet aan een andere (echte) verklaring voorafgaan. Dit zou niet de eerste instructie in een functiescript moeten zijn: het kan worden voorafgegaan door andere operatoruitdrukkingen die uit tekenreeksliteralen bestaan ​​(en JavaScript-implementaties kunnen worden bekeken als specifieke richtlijnen voor de implementatie). String-literals die de eerste echte operator volgen (in een script of functie) zijn eenvoudige expressies. Tolken moeten ze niet interpreteren als richtlijnen en hebben geen effect.

use strict directive geeft aan dat de volgende code (in een script of functie) een strikte code is. De code op het hoogste niveau van het script (code die niet in de functie voorkomt) wordt beschouwd als een strikte code wanneer het script de use strict use strict use strict bevat. De inhoud van een functie wordt als een strikte code beschouwd wanneer de functie zelf is gedefinieerd in een strikte code of wanneer de functie use strict directive bevat. De code die aan de methode eval() wordt doorgegeven, wordt als een strenge code beschouwd wanneer eval() wordt aangeroepen vanuit een tekenreekscode of de use strict richtlijn voor use strict bevat.

De strikte modus ECMAScript 5 is een beperkte subset van de JavaScript-taal, die de corresponderende taalfouten wegneemt en een strengere foutcontrole en verhoogde beveiliging biedt. Het volgende zijn de verschillen tussen de strikte modus en de normale modus (waarvan de eerste drie bijzonder be>

  • Je kunt het niet gebruiken with -statement in de strikte modus.
  • In de strikte modus moeten alle variabelen worden gedeclareerd: als u een waarde toekent aan een identifier die niet als een variabele is gedeclareerd, een functie, een functieparameter, een catch-clause parameter of een globale Object , dan krijgt u een ReferenceError . In de normale modus wordt een identifier impliciet gedeclareerd als een globale variabele (als een eigenschap van een globaal 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