On Github stephCoue / pk-t-es-strict
Par @stephCoue UX-Scientist @UXRepublic
source ECMAScript5.1
Un meilleur débogage.
Le mode strict remonte bien plus d'erreurs, une bonne chose pour attirer notre attention sur nos premières erreurs basiques.
Il est considéré comme invalide et remonte une erreur de syntaxe dès lors qu'il est parsé.
// Erreur de syntaxe en mode strict with (location) { console.log(href); }
Une variable doit être déclarée avant d'être assignée.
// Erreur de référence en mode strict (function() { varSortieDeNullPart = "toto"; }());
Un important changement : la valeur this.prop de null ou undefined n’est plus associée à la globale. Mais les valeurs originelles sont conservées.
window.color = "black"; function sayColor() { console.log(this.color); } // Erreur de Typage en mode strict, au lieu de "black" sayColor(); // Erreur de Typage en mode strict, au lieu de "black" sayColor.call(null);
Donc une valeur doit être assignée à this.prop sinon elle reste undefined. Cas conséquent : l'appel d'un Constructeur sans le new est aussi affecté.
function Person(name) { this.name = name; } // Error in strict mode var me = Person("Steph");
Dans ce code this est undefined quand on appelle la fonction Constructeur Person() sans new. En mode non-strict this sera remplacé par la variable globale et name assigné à la propriété de la globale.
// Erreur de syntaxe en mode strict - duplicate arguments function faireUnTruc(valeur1, valeur2, valeur1) { // code } // Erreur de syntaxe en mode strict - duplicate properties var object = { foo: "bar", foo: "baz" };
Ce sont deux erreurs de syntaxe et elle sont remontées avant même être exécutées.
ECMAScript apporte un lot de changements à eval(); le plus significatif est que les variables ou fonctions declarées dans eval() ne sont plus créées dans le “scope container”
(function() { eval("var x = 10;"); // En mode non-strict , log 10 // Erreur de reférence en mode strict console.log(x); }());
Toute variable ou fonction crée dans eval() reste dans eval(). Après, rien n'empêche d'assigner la valeur retour de eval()…
Une erreur est remontée si l'on tente de modifier un object non-extensible.
var testObj = Object.defineProperties({}, { prop1: { value: 10, writable: false // by default }, prop2: { get: function () { } } }); // Echoue en silence en mode non-strict, remonte use erreur en mode strict testObj.prop1 = 20; // Assignation à une propriété en lecture seule testObj.prop2 = 30; // Assignation à une propriété qui n'a une méthode get
Il est recommandé d'utiliser le mode strict dès que l'on se sert des spécificités ECMAScript 5
"use strict;"
À l'évaluation de ce string le moteur de rendu javascript passe en mode strict pour les navigateurs qui supportent (un navigateur ne supportant pas évaluera, puis ne pouvant l'assigner, il poursuivra)
Dans le monde de tous les jours, où la concaténation règne sur nos fichiers.
// Ne pas Faire! "use strict"; function doSomething() { // En strict mode } function doSomethingElse() { // Ici aussi }
Le passage en strict de certain fichiers peut faire remonter des erreurs…
Pour cette raison il est mieux d'utiliser le mode strict dans une fonction.
function doSomething() { "use strict"; // En strict mode } function doSomethingElse() { // this doesn't run in strict mode }
Avec un support dès ie10 et dans tous les navigateurs modernes, on peut utiliser use strict dès aujourd'hui...
On recrute chez UX-Republic (Paris)