Qu'est-ce que "use strict" en JavaScript et pourquoi en débat-on ?
\n\nAvez-vous déjà écrit du code JavaScript qui fonctionnait « bizarrement » ? Une variable se déclarait toute seule, this pointait vers l'objet global au lieu de ce que vous attendiez, et une erreur était simplement avalée en silence ? Bienvenue dans le monde du JS « sale ».
La directive "use strict" n'est ni une fonction ni un opérateur. C'est littéralement un interrupteur de mode pour votre script ou votre fonction. Lorsque vous écrivez "use strict" au début d'un fichier ou d'une fonction, vous dites au moteur JavaScript : « Hé, ne me pardonne pas mes erreurs. Sois plus strict, mais plus honnête ».
Ce sujet est l'une des questions les plus populaires sur Stack Overflow (des milliers de vues). Décortiquons ce que fait exactement le mode strict, pourquoi il a été inventé et comment l'utiliser pour ne pas vous tirer une balle dans le pied.
\n\nComment activer le mode strict ?
\n\nDeux façons seulement :
\n\n- \n
- Globalement (pour tout le script) :
"use strict";à la première ligne du fichier. \n - Localement (pour une fonction) :
"use strict";à la première ligne du corps de la fonction. \n
// Mode strict global\n"use strict";\nlet x = 10;\n\n// Mode strict local\nfunction myFunc() {\n "use strict";\n let y = 20;\n}\n\nImportant : Si vous mélangez du code strict et non strict dans un même fichier (par exemple, en concaténant des scripts), des problèmes peuvent survenir. Il est préférable d'utiliser le mode strict pour des fonctions individuelles ou des modules (les modules ES6 sont automatiquement stricts).
\n\nTop 5 des erreurs que "use strict" empêche
\n\nL'objectif principal de "use strict" est de transformer les erreurs « silencieuses » de JavaScript en exceptions explicites (des erreurs qui sont levées et peuvent être attrapées). Voici les 5 cas les plus fréquents.
1. Interdiction de la création implicite de variables globales
\n\nC'est un classique. En mode normal, si vous oubliez d'écrire var, let ou const, la variable devient automatiquement globale. Cela peut entraîner des bugs difficiles à détecter.
// Sans "use strict"\nfunction sum(a, b) {\n total = a + b; // Erreur ? Non. total est devenue une variable globale !\n}\nsum(2, 3);\nconsole.log(total); // 5 — ça marche, mais c'est horrible.\n\n// Avec "use strict"\n"use strict";\nfunction sumStrict(a, b) {\n total = a + b; // ReferenceError: total is not defined\n}\nsumStrict(2, 3); // Erreur ! Le code plante immédiatement.\n\nComment l'éviter ? Déclarez toujours les variables. Utilisez let et const au lieu de var pour éviter le hoisting et les variables globales accidentelles.
2. Affectation de valeur à des propriétés non inscriptibles
\n\nEn mode normal, JavaScript ignore silencieusement la tentative de modifier NaN, undefined ou un objet gelé. En mode strict, une erreur est levée.
"use strict";\n\n// Tentative de réécrire NaN\nNaN = 123; // TypeError: Cannot assign to read only property 'NaN'\n\n// Tentative de modifier un objet gelé\nconst obj = Object.freeze({name: "Alice"});\nobj.name = "Bob"; // TypeError: Cannot assign to read only property 'name'\n\nComment l'éviter ? N'essayez pas de redéfinir les constantes intégrées. Utilisez Object.freeze() en connaissance de cause.
3. Suppression de variables, fonctions et arguments
\n\nVous ne pouvez pas supprimer une variable déclarée avec var ou let, ni supprimer une fonction. En mode normal, cela est simplement ignoré.
"use strict";\n\nvar x = 10;\ndelete x; // SyntaxError: Delete of an unqualified identifier in strict mode.\n\nfunction foo() {}\ndelete foo; // SyntaxError\n\nComment l'éviter ? N'utilisez pas delete pour les variables. Il est nécessaire uniquement pour supprimer des propriétés d'objets : delete obj.prop.