Table of Contents
JavaScript blijft een van de meest gebruikte programmeertalen op het web, waardoor alles van eenvoudige interactieve vormen tot complexe single-page toepassingen wordt aangedreven. Naarmate projecten groeien in grootte en teamleden toenemen, wordt de behoefte aan betrouwbare, voorspelbare code voorop gesteld. Dit is waar JavaScript een strikte mode .Een functie geïntroduceerd in ECMAScript 5 . Strikte modus laat ontwikkelaars om te kiezen in een beperkte hoeveelheid van de taal, helpen gemeenschappelijke fouten te vangen, gevaarlijke acties te voorkomen, en uiteindelijk produceren veiliger en onderhoudbare code. Door het opleggen van strengere parsing en foutafhandeling, maakt strikte modus eerder stille storingen in expliciete uitzonderingen, waardoor debugging gemakkelijker en het aanmoedigen van betere codering gewoonten. In deze uitgebreide gids, well verkennen wat strenge modus is, hoe het in staat, hoe het, de vele voordelen, en praktische voorbeelden om de impact te illustreren.
Wat is Strict Mode?
Strikte modus is een manier om een meer gedisciplineerde deelverzameling van JavaScript te kiezen. Als dit ingeschakeld is, draait de JavaScript-engine de code onder een reeks beperkingen die sommige van de meer foutgevoelige functies van de taal elimineren. Het idee achter strikte modus is om ontwikkelaars eerder feedback te geven over potentiële problemen. Bijvoorbeeld, in niet-strikte modus (vaak genoemd "sloppy mode"), waarbij een waarde wordt toegewezen aan een niet-gedefineerde variabele, creëert stilletjes een globale variabele. In strikte modus, gooit deze shells een []. Evenzo staat strikte modus het gebruik van bepaalde gedepreciseerde of problematische constructies, zoals de statement en octale numerieke literals, uit. Het doel is om JavaScript betrouwbaarder, veiliger en consistenter te maken, vooral in grote codebases.
ECMAScript 5 introduceerde strikte modus in 2009 als een manier om de taal te ontwikkelen zonder de compatibiliteit achterwaarts te breken. Ontwikkelaars konden kiezen voor het nieuwe, strengere gedrag door simpelweg toe te voegen aan de bovenkant van een script of functie. Sindsdien is strikte modus een aanbevolen praktijk in vele stijlhandleidingen geworden en wordt automatisch toegepast in moderne JavaScript-constructies zoals ES-modules (import/export) en klasse-organen. Begrijpen hoe streng de modus werkt is essentieel voor elke professionele JavaScript-ontwikkelaar.
Hoe Strict Mode in te schakelen
Het inschakelen van strikte modus is eenvoudig: je voegt de string letterlijk (of ) in het begin van een script of functie. Deze richtlijn is geen uitspraak maar een pragma dat de motor vertelt de volgende code in strikte modus te verwerken. Het kan worden toegepast op twee gebieden: wereldwijd (voor een volledig script) of lokaal (voor een enkele functie). Daarnaast zijn ES modules en klassen automatisch in strikte modus, dus er is geen expliciete richtlijn nodig.
Strikte modus voor scriptniveau
Om een strikte modus voor een heel JavaScript bestand of inline blok in te schakelen, plaats als de allereerste regel van het script (voordat andere verklaringen worden gegeven). Bijvoorbeeld:
// script.js
'use strict';
var x = 10;
console.log(x); // works normally
// Attempting to use undeclared variables throws an error
y = 20; // ReferenceError: y is not defined
Wanneer wereldwijd toegepast, heeft de strikte modus invloed op alle code in dat scriptbestand. Als u meerdere scripts concateert, zullen alleen diegene die beginnen met in strikte modus draaien. Het is belangrijk om op te merken dat een strikt modescript niet kan mengen met niet-strikte code in hetzelfde bestand tenzij u functie-niveau scoping gebruikt.
Strikte modus voor functieniveau
U kunt ook een strikte modus in een specifieke functie inschakelen, waardoor de rest van het script in slordige modus blijft. Dit is handig bij het geleidelijk migreren van een codebase of wanneer u wilt dat een strikte controle alleen voor bepaalde functies. Plaats bovenaan het functielichaam, vóór andere verklaringen:
function strictFunction() {
'use strict';
// Inside this function, strict mode applies
var a = 1;
b = 2; // ReferenceError: b is not defined
}
function sloppyFunction() {
// Outside strictFunction, sloppy mode still applies
c = 3; // creates global variable c
}
Functie-niveau strikte modus is alleen van toepassing op de eigen code van de functie, niet op geneste functies (tenzij ze ook verklaren ). Echter, in de praktijk is het gebruikelijk om strikte modus op het bestandsniveau voor consistentie te stellen.
Modules en klassen
Met de komst van ES6 (ES2015), JavaScript geïntroduceerd modules en klassen. Beide zijn automatisch in strikte modus standaard. Daarom, als je je code schrijven met behulp van / syntax of definiëren een ], hoeft u niet toe te voegen ]strikt modus wordt automatisch afgedwongen. Bijvoorbeeld:
// module.js (no 'use strict' needed)
export function add(a, b) {
// strict mode is active here
return a + b;
}
// class definition (strict mode active)
class MyClass {
constructor(value) {
this.value = value;
}
}
Deze automatische handhaving maakt code in modules en klassen inherent veiliger en gemakkelijker te redeneren.
Belangrijkste voordelen van het gebruik van Strict Mode
Strikte modus biedt een heleboel voordelen die direct code kwaliteit, beveiliging en ervaring van de ontwikkelaar te verbeteren. Laten we elk voordeel in detail te onderzoeken.
Voorkomt per ongeluk voorkomende globale variabelen
In niet-strict mode, het toewijzen van een waarde aan een niet-gemarkeerde variabele automatisch maakt een eigenschap op het globale object ([] in browsers, in Node.js). Dit kan gemakkelijk gebeuren als gevolg van typografische fouten of vergeten verklaringen, vervuilende de globale naamruimte en het veroorzaken van subtiele bugs. Strikte modus maakt dit onmogelijk door het gooien van een ]. Bijvoorbeeld:
// Non-strict: silently creates global variable
function setup() {
developer = "Alice"; // accidentally global
}
// Strict: throws ReferenceError
function setup() {
'use strict';
developer = "Alice"; // ReferenceError: developer is not defined
}
Deze handhaving dwingt ontwikkelaars om expliciet variabelen aan te geven met , , of ], waardoor de reikwijdte van bugs wordt verminderd.
Verwijdert stille fouten
JavaScript is vaak vergevingsgezind wanneer operaties niet in stilte werken. Bijvoorbeeld, toewijzen aan een alleen-lezen eigenschap (zoals of een bevroren object) doet gewoon niets in slordige modus. In strikte modus, dergelijke opdrachten gooien een . Op dezelfde manier, pogingen om undeletable eigenschappen te verwijderen (bijv. ) gooit een fout in plaats van stil terug te keren ]. Dit maakt het debuggen veel gemakkelijker omdat de ontwikkelaar onmiddellijke feedback ontvangt.
// Non-strict: assignment silently fails
var obj = Object.freeze({name: "Bob"});
obj.name = "Charlie"; // silently ignored
// Strict: TypeError thrown
'use strict';
var obj = Object.freeze({name: "Bob"});
obj.name = "Charlie"; // TypeError: Cannot assign to read-only property 'name'
Voorkomt dupliceren parameternamen
In niet-strikte modus kunnen functies dubbele parameternamen hebben, wat kan leiden tot verwarrend gedrag (de laatste dubbele overschrijft eerdere). Strikte modus verbiedt dit, waarbij een .9.]] op parse tijd wordt gegooid. Bijvoorbeeld:
// Non-strict: allowed
function sum(a, a, c) {
return a + a + c; // a equals the second argument passed
}
// Strict: SyntaxError
'use strict';
function sum(a, a, c) { // SyntaxError: Duplicate parameter name not allowed in strict mode
return a + a + c;
}
Deze beperking helpt voorkomen dat toevallige overschrijven van parameters, maken functie handtekeningen duidelijker en minder foutgevoelig.
Beperkt de Statement
De verklaring wordt al lang als schadelijk beschouwd omdat het dubbelzinnigheid creëert over variabele resolutie en de prestaties afbreekt. Strikte modus staat de statement volledig uit, waarbij een ] op compilatietijd wordt gegooid. Deze verwijdering moedigt ontwikkelaars aan om meer voorspelbare patronen te gebruiken, zoals desstructurering of expliciete toegang tot eigendom.
Merken Veiliger
In de niet-strict mode kan nieuwe variabelen introduceren in de omgeving, wat leidt tot onvoorspelbare bijwerkingen. Strikte modus verandert het gedrag van zodat het alleen variabelen creëert binnen de eval code zelf.Theys lekken niet in de omsluitcontext. Dit maakt de code gemakkelijker te redeneren over en voorkomt per ongeluk per ongeluk per ongeluk perversiteitsvervuiling.
// Non-strict: eval creates variable in outer scope
var x = 1;
eval("var x = 2;");
console.log(x); // 2
// Strict: eval has its own scope
'use strict';
var x = 1;
eval("var x = 2;");
console.log(x); // 1
Prohibits Octal Numeric Literals
Historisch gezien interpreteerde JavaScript getallen met een vooraanstaande nul (bv. ) als octaal (basis 8). Dit gedrag veroorzaakte vaak verwarring en bugs, vooral wanneer het omgaan met strings zoals "010" wordt doorgelezen als getallen. Strikte modus verbiedt octale numerieke letterlijke (behalve de ES6+ ] prefix) en gooit een ]. Dit elimineert een hele klasse van subtiele bugs.
// Non-strict: 010 means octal 8
console.log(010); // 8
// Strict: SyntaxError
'use strict';
console.log(010); // SyntaxError: Octal literals are not allowed in strict mode
Het verwijderen van gewone variabelen wordt niet toegestaan
In de niet-strict mode kunt u proberen variabelen of functieverklaringen te verwijderen, maar de operatie mislukt stilletjes ([] geeft ]). Strikte modus gooit een ] als u probeert een gewone variabele, functie of functieparameter te verwijderen. Dit voorkomt toevallige pogingen om dingen te verwijderen die niet kunnen worden verwijderd, en verduidelijkt de intentie van de ontwikkelaar.
// Non-strict: attempt silently fails
var a = 1;
delete a; // false; a still exists
// Strict: SyntaxError
'use strict';
var a = 1;
delete a; // SyntaxError: Delete of an unqualified identifier in strict mode
Aanvullende verbeteringen op het gebied van beveiliging en prestaties
Naast de specifieke beperkingen, kunnen strenge modus JavaScript-motoren bepaalde optimalisaties uitvoeren die anders onmogelijk zijn. Omdat strikte modus sommige dynamische gedragingen elimineert (zoals de statement en impliciete globals), kan de motor beter voorspellen hoe variabelen gebruikt zullen worden, wat in sommige gevallen tot snellere uitvoering leidt. Bovendien schakelt de strikte modus de eigenschap uit en de eigenschap van functies ] die historisch werden gebruikt voor introspectie, maar ook veiligheidsrisico's met het toestaan van toegang tot de call stack. Deze beperking versterkt de inkapseling en voorkomt bepaalde soorten aanvallen.
Praktische voorbeelden van Strict Mode in actie
Om begrip te versterken, laten we een reeks voorbeelden doorlopen die slordige modus contrasteren met strikte modus. Deze tonen de directe feedback strikte modus.
Voorbeeld 1: Niet-opgegeven variabele toewijzing
// sloppy.js
function userInfo() {
name = "John"; // silently creates global 'name'
}
userInfo();
console.log(window.name); // "John" (in browsers)
// strict.js
'use strict';
function userInfo() {
name = "John"; // ReferenceError: name is not defined
}
userInfo();
Zonder strikte modus kan een eenvoudige typfout als in plaats van de globale scope vervuilen. Met strikte modus wordt de fout direct opgevangen.
Voorbeeld 2: Opdracht aan een alleen-lezen globale eigenschap
// sloppy mode
undefined = 5; // silently fails (undefined remains undefined)
NaN = 6; // silently fails
console.log(undefined, NaN); // undefined, NaN
// strict mode
'use strict';
undefined = 5; // TypeError: Cannot assign to read-only property 'undefined' of object '#<Window>'
NaN = 6; // TypeError
Strikte modus voorkomt toevallige overschrijven van globale constanten die nooit zouden moeten veranderen, helpen de integriteit van de runtime omgeving te behouden.
Voorbeeld 3: Dubbele naam van objecteigenschap
In strikte modus, dupliceer eigenschappen namen in object letterlijk veroorzaken een . In slordige modus, de laatste wint. Dit is vooral nuttig voor het detecteren van fouten bij het bewerken van configuratie objecten of bij het kopiëren van code.
// sloppy: works, last value wins
var config = {
host: "example.com",
host: "backup.com" // no error
};
console.log(config.host); // "backup.com"
// strict: SyntaxError
'use strict';
var config = {
host: "example.com",
host: "backup.com" // SyntaxError: Duplicate data property in object literal not allowed in strict mode
};
Veel voorkomende Pitfalls en Migreren naar Strict Mode
Hoewel strikte modus veel voordelen oplevert, kan het migreren van een grote bestaande codebase uitdagingen opleveren. Sommige oudere patronen die in ES3/5 aanvaardbaar werden geacht, kunnen nu falen. De meest voorkomende problemen zijn:
- Onverklaarde variabele toewijzingen: Code die op impliciete globalen vertrouwt moet worden bijgewerkt om variabelen aan te geven.
- Met verklaringen : Deze moeten worden verwerkt in expliciete toegangen tot eigendom.
- Octale letterlijke tekst: Vervang door of decimale tekst .
- Toevoeging : Dit is niet toegestaan; gebruik in plaats daarvan de genoemde functieuitdrukkingen.
- Samenvoegen van parameternamen: Moet verwijderd of hernoemd worden.
- Gebruik van op variabelen of functies: Die operatie is verboden.
Het migratieproces is vaak incrementeel. U kunt strikte modus functie-by-functie inschakelen met behulp van de pragma binnen functies, grondig testen, en vervolgens wereldwijd inschakelen zodra u vertrouwen hebt. Hulpmiddelen zoals ESLint met zijn regel kan helpen overtredingen automatisch te identificeren. Bovendien, het gebruik van ES modules of klassen geeft automatisch strikte modus gedrag, dus migreren naar moderne syntaxis is een natuurlijk pad naar strengere code.
Het is ook de moeite waard om te vermelden dat strikte modus is geen prestatie moordenaar. In feite, zoals gezegd, sommige motoren kunnen de strikte modus code beter optimaliseren. De eerste runtime controle voor de richtlijn is verwaarloosbaar, en de algemene code duidelijkheid en veiligheid veel zwaarder dan eventuele marginale kosten.
Conclusie en beste praktijken
JavaScript's strikte modus is een krachtig hulpmiddel voor het schrijven van robuuster, onderhoudbaar en veiliger code. Door in deze beperkte deelverzameling van de taal te kiezen, krijgen ontwikkelaars aan het begin van een script of functie vroege detectie van gemeenschappelijke fouten, vermijden ze gevaarlijke constructies, en profiteren van betere prestaties in veel gevallen. Het inschakelen van strikte modus is zo eenvoudig als het toevoegen aan het begin van een script of functie, en het is automatisch actief in ES modules en klassen. De voordelen die het voorkomen van toevallige globalen, elimineren van stille fouten, beperken schadelijke functies zoals en vertaal rechtstreeks in minder bugs en sneller debugcycli.
Voor elk project, of het nu nieuw of legacy is, moet het aannemen van strikte modus worden beschouwd als een beste praktijk. Begin met het gebruik van een linter om schendingen te identificeren, fix ze geleidelijk, en vaak testen. Moderne JavaScript tools en kaders vaak nemen strikte modus (of handhaven), dus het afstemmen met die conventie zorgt voor compatibiliteit en consistentie. Door strikte modus te omarmen, sluit u zich aan bij de bredere JavaScript gemeenschap in het prioriteren van codekwaliteit en veiligheid.
Om dieper te duiken, verwijzen we naar de MDN documentatie op strikte modus voor een volledige lijst van beperkingen en voorbeelden. Voor historische context, legt de ECMAScript specificatie[] de formele regels uit. Daarnaast biedt de ESLint strikte regel[] een geautomatiseerde manier om consistent gebruik in uw project af te dwingen. Door strikte modus te maken zal een gewoonte dividenden betalen in code betrouwbaarheid en productiviteit van de ontwikkelaar voor de komende jaren.