pk-t-es-strict



pk-t-es-strict

0 0


pk-t-es-strict

[Fr] Lightning talk @FranceJS.in(Toulouse) on Saturday 23rd November, 2013 3:25pm to 3:30pm

On Github stephCoue / pk-t-es-strict

Pk t'es "strict"?

Par @stephCoue UX-Scientist @UXRepublic

Le mode strict

ECMAScript defines a strict variant of the language. The strict variant of the language excludes some specific syntactic and semantic features of the regular ECMAScript language and modifies the detailed semantics of some features. The strict variant also specifies additional error conditions that must be reported by throwing error exceptions in situations that are not specified as errors by the non-strict form of the language.

source ECMAScript5.1

En résumé

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.

Quelques changements…

Disparition de with

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);
  }

Plus de globale accidentelle

Une variable doit être déclarée avant d'être assignée.

  // Erreur de référence en mode strict
  (function() {

      varSortieDeNullPart = "toto";

  }());
  





L'utilisation de this

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.

Pas de doublons

  
  //  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.

eval()

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()…

Object non-extensible

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

Les bonnes pratiques

Il est recommandé d'utiliser le mode strict dès que l'on se sert des spécificités ECMAScript 5

Invoquer le mode strict

  "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
  }

En Conclusion

Avec un support dès ie10 et dans tous les navigateurs modernes, on peut utiliser use strict dès aujourd'hui...

Références:

Merci

@stephCoue +StéphaneCoué

Ah oui!!

On recrute chez UX-Republic (Paris)