JavaScript strict mode: wat het verandert en hoe je het aanzet

JavaScript strict mode: wat het verandert en hoe je het aanzet

Wat is strict mode?

Strict mode is geïntroduceerd in ECMAScript 5 (ES5). Het is een strengere, beperktere variant van JavaScript die fouten opwerpt bij vergissingen die normaal in stilte worden afgehandeld. Initialiseer je in niet-strikte modus bijvoorbeeld een variabele zonder hem met het keyword var te declareren (x = 5, bijvoorbeeld), dan gaat de JavaScript-interpreter ervan uit dat je een globale variabele bedoelde, en bestond die nog niet, dan maakt hij er zelf een aan.

Ook verouderde functies kunnen in strict mode fouten opleveren. Strict mode beperkt zo het aantal bugs en verbetert zowel de veiligheid als de algehele prestaties van je applicatie.

Strict mode inschakelen

Om strict mode in te schakelen zet je simpelweg de string “use strict” bovenaan je script, zoals in het volgende voorbeeld:

javascript
"use strict";
x = 5; // ReferenceError: x is not defined
console.log(x);

Zet je de directive “use strict” op de eerste regel van je JavaScript-programma, dan geldt strict mode voor het hele script. Je kunt strict mode ook alleen binnen één functie inschakelen, zo:

javascript
x = 5;
console.log(x); // 5
function sayHello() {
    "use strict";
    str = "Hello World!"; // ReferenceError: str is not defined
    console.log(str);
}
sayHello();

Goed om te weten: de directive “use strict” wordt alleen herkend aan het begin van een script of van een functie. Alle moderne browsers ondersteunen de directive “use strict” behalve Internet Explorer 9 en ouder. Browsers die hem niet ondersteunen negeren hem stilzwijgend en parsen de JavaScript in niet-strikte modus.

De algemene beperkingen van strict mode

Strict mode verandert zowel de syntaxis als het gedrag tijdens de uitvoering. In de volgende secties lopen we de algemene beperkingen langs die eronder vallen:

Niet-gedeclareerde variabelen zijn niet toegestaan

Zoals je al weet moet in strict mode elke variabele gedeclareerd zijn. Ken je een waarde toe aan een identifier die geen gedeclareerde variabele is, dan krijg je een ReferenceError.

javascript
"use strict";

function doSomething() {
    msg = "Hello world!"; // ReferenceError: msg is not defined
    return msg;
}
console.log(doSomething());

Een variabele of functie verwijderen mag niet

Probeer je in strict mode een variabele of een functie te verwijderen, dan volgt er een syntaxisfout. In niet-strikte modus mislukt zo’n poging stilzwijgend en levert de delete-expressie false op.

javascript
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxError

Net zo krijg je een syntaxisfout wanneer je in strict mode een functie probeert te verwijderen:

javascript
"use strict";
function sum(a, b) {
    return a + b;
}
delete sum; // SyntaxError

Dezelfde parameternaam twee keer mag niet

In strict mode volgt er een syntaxisfout zodra een functiedeclaratie twee of meer parameters met dezelfde naam heeft. In niet-strikte modus gebeurt er niets.

javascript
"use strict";

function test(a, a) { // SyntaxError
    return a * a;
}
console.log(square(2, 2));

eval() kan de omliggende scope niet meer wijzigen

In strict mode kan code die aan eval() wordt doorgegeven om veiligheidsredenen geen variabelen declareren of wijzigen en geen functies definiëren in de omliggende omgeving, zoals dat in niet-strikte modus wel kan.

javascript
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined

eval en arguments kunnen niet als identifier dienen

In strict mode worden de namen eval en arguments als keywords behandeld, ze kunnen dus niet dienen als variabelenaam, functienaam, parameternaam enzovoort.

javascript
"use strict";
var eval = 10; // SyntaxError
console.log(eval);

Het statement with is niet toegestaan

In strict mode is het statement with niet toegestaan. Het statement with voegt de eigenschappen en methodes van een object toe aan de huidige scope. Statements die genest zijn in een with-blok kunnen die eigenschappen en methodes daardoor rechtstreeks aanroepen, zonder naar het object te verwijzen.

javascript
"use strict";

// Zonder with
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;

// Met with
var radius2 = 5;
with(Math) { // SyntaxError
    var area2 = PI * radius2 * radius2;
} 

Schrijven naar een alleen-lezen eigenschap mag niet

In strict mode gooit het toekennen van een waarde aan een niet-schrijfbare eigenschap, aan een eigenschap met alleen een getter of aan een eigenschap die niet bestaat een fout. In niet-strikte modus mislukken die pogingen stilzwijgend.

javascript
"use strict";

var personne = {name: "Damien", age: 25};

Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeError

Een nieuwe eigenschap toevoegen aan een niet-uitbreidbaar object mag niet

In strict mode gooien pogingen om nieuwe eigenschappen aan te maken op niet-uitbreidbare of onbestaande objecten eveneens een fout. In niet-strikte modus mislukken die pogingen stilzwijgend.

javascript
"use strict";

var person = {name: "Damien", age: 25};

console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); //  het object personne vergrendelen
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeError

Octale getallen zijn niet toegestaan

In strict mode zijn octale getallen (cijfers voorafgegaan door een nul, bijvoorbeeld 010 of 0377) niet toegestaan. In niet-strikte modus worden ze wel door alle browsers ondersteund. In ES6 kun je octale getallen schrijven door het getal te laten voorafgaan door 0o, dus 0o10, 0o377 enzovoort.

javascript
"use strict";

var x = 010; // SyntaxError
console.log(parseInt(x));

De voorbeelden hierboven laten duidelijk zien hoe strict mode je helpt de veelgemaakte fouten te vermijden die bij het schrijven van een JavaScript-programma zo vaak onopgemerkt blijven.

Keywords die voor de toekomst gereserveerd zijn, mogen niet

Strict mode legt beperkingen op aan het gebruik van de keywords die voor toekomstige versies van de taal gereserveerd zijn.

Volgens de recentste standaard ECMAScript 6 (of ES6) zijn dit gereserveerde keywords in strict mode: await, implements, interface, package, private, protected, public en static. Voor de beste compatibiliteit kun je gereserveerde keywords sowieso beter niet als variabele- of functienaam in je programma gebruiken.

Tip: gereserveerde woorden, ook keywords genoemd, zijn speciale woorden die deel uitmaken van de syntaxis van JavaScript, bijvoorbeeld var, if, for, function enzovoort.

···

JavaScript

Damien Flandrin Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.