
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:
"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:
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.
"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.
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxErrorNet zo krijg je een syntaxisfout wanneer je in strict mode een functie probeert te verwijderen:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxErrorDezelfde 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.
"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.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not definedeval 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.
"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.
"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.
"use strict";
var personne = {name: "Damien", age: 25};
Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeErrorEen 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.
"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"; // TypeErrorOctale 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.
"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,functionenzovoort.
···


