jeudi 24 décembre 2015

JavaScript, les bonnes résolutions 2016

S'il y a bien un langage que tout le monde déteste, c'est bien JavaScript.
Pourtant, force est de constater que personne n'a réussi à le "tuer". C'est même tout le contraire qui s'est passé.
Devant l'échec de GWT ou Dart à s'imposer, on ne peut qu'admirer la progression fulgurante de NodeJS, AppJS ou Electron.

Alors pourquoi tant de monde le déteste ? D'une part, il suffit de citer la définition de Wikipédia pour comprendre, qu'on ne comprend rien :

C’est un langage orienté objet à prototype, c’est-à-dire que les bases du langage et ses principales interfaces sont fournies par des objets qui ne sont pas des instances de classes, mais qui sont chacun équipés de constructeurs permettant de créer leurs propriétés, et notamment une propriété de prototypage qui permet d’en créer des objets héritiers personnalisés. En outre, les fonctions sont des objets de première classe.


et d'autre part, il y a plein de moteur JS différents qui apporte donc une implémentation différente et des bugs différents.
JavaScript c'est quoi ?
Javascript n'est pas un langage objet ! Même si on le voit écrit partout c'est faux.
Pour rappel un langage object c'est :
  • classe,
  • polymorphisme,
  • héritage,
  • objet,
  • encapsulation,
  • messages.
La portée des variables, ce ne sera plus un mystère
Si vous définissez une variable sans mot clef var devant, votre variable sera globale (non, pas d'erreur de type variable non définie).
Si vous utilisez le mot clef var, la variable aura la porté de la fonction où elle est définie.

Exemple :
// Si les déclarations sont hors fonction, ça revient au même
variableGlobale = 1;
var variableGlobale = 2;

function toto() {
    // variableGlobale est accessible, modifiable...
    var local = variableGlobale;

    // local vaut 2
    variableGlobale = 3;

    for (var index = 0; index < 3; index++) {
        // un block : for, while... n'est pas une fonction !
        // index sera donc accessible en dehors de ce bloc.
        // Si on veut une variable locale, il faut être un EcmaScript 6 et utiliser le mot clef let !
    }
}

// variableGlobale vaut 3
// local n'existe pas.
Il faut noter qu'une variable globale est accessible avant d'être créée !
La portée des fonctions, ce ne sera plus un mystère
Pour les fonctions, il faut bien avouer que c'est un peu plus compliqué.
Si vous déclarer une fonction comme ceci : function helloWorld(), alors la fonction sera globale et accessible avant même d'être déclarée.

Par contre, si vous déclarez la fonction sans le mot clef function, la fonction ne sera accessible qu'après avoir été déclarée.
La porté des variables : le contexte de la fonction avec this
Nous l'avons vu pour les variables, une fonction limite la portée des variables.
En effet, une fonction a un contexte, le fameux mot clef this. Et oui this représente la fonction en cours !

Exemple :
function toto() {
    // this représente la fonction toto()
    var func = function() {
        // this représente la fonction func()
    };
}

Pour conserver le contexte d'une fonction, il donc stocker le contexte dans une variable :
function toto() {
    var me = this;
    // this et 'me' représente la fonction toto()
    var func = function() {
        var me = this;
        // this et 'me' représente la fonction func()
    };

    // 'me' représente toujours la fonction toto()
}
Allez encore plus loin
Inutile que je répète ce qui a déjà été très bien expliqué !
Je vous conseille de lire cette page : braincracking.org.

Pour votre culture, le premier langage par prototype : Self.