Javascript


Les fondamentaux



   Jean-pierre VINCENT (indépendant)
   Pierre lagarde (Microsoft)
Qui ça ?
     Jean-pierre VINCENT

braincracking.org (veille techno)
@theystolemynick

12 ans de Web
Consultant, formateur, expertise
Pourquoi Javascript ?
Présent partout
●
 Navigateur
●
 Jeux Web (remplace Flash)
●
 Mobile (Phonegap ...)
●
 Télévisions
●
 Serveur (Node.js, ...)
●
 Software (Chromeless, ...)
●
 OS (JoliCloud, WebOS...)
●
 Windows 8 !
Mauvaise réputation
Mauvaise réputation

parseInt('06'); // 6
parseInt('08'); // 0




      wftjs.com
Mauvaise réputation

typeof NaN // number
NaN === NaN // false

typeof null // object
null instanceof Object // false



          wftjs.com
Mauvaise réputation

(1.7976931348623157e+308 ===
1.7976931348623158e+308 )// true!

alert(111111111111111111111); //
alerts 111111111111111110000

9999999999999999 //=> 10000000000000000


              wftjs.com
APIs
●   DOM (window.document)

●   Node

●   WinRT

●   ...
Compliqué ?
Différent !
Historique court
● Né pendant la guerre (95)
● En quelques semaines

● Influence Erlang, Lisp, Python, Askell




    IE et Netscape d'accord pour
            EcmaScript 3
Evolution
●
 EcmaScript 5
●
 Harmony
●
 EcmaScript.Next
●
 EcmaScript.Next.Next
En attendant ...


   EcmaScript 3
Objectifs

Portée des variables (var + function)
●




Contexte (this)
●




Function()
●
Portée des variables

 1 closure = 1 portée

Closure = function() {
    PORTÉE
}
Portée des variables
test1 = function() {
     var x = 1;




    console.log(x); // 1
}();
console.log(x); // undefined
Portée des variables
test1 = function() {
     var x = 1;
     test2 = function() {
     var x = 2;



    console.log(x); // 2
    }();
    console.log(x); // ?
}();
console.log(x); // undefined
Portée des variables
test1 = function() {
     var x = 1;
     test2 = function() {
     var x = 2;



    console.log(x); // 2
    }();
    console.log(x); // 1
}();
console.log(x); // undefined
Portée des variables
test1 = function() {
     var x = 1;
     test2 = function() {
     var x = 2;
     test3 = function() {
     console.log(x); // 2
     }();
     console.log(x); // 2
     }();
     console.log(x); // 1
}();
console.log(x); // undefined
Démo « porté et boucle »
Morales

1 Toujours utiliser var
Application pratique


Démo « module pattern »
Créer un scope
1/3 : fonction anonyme
 function() {
    var privateVariable = true;
    console.log( privateVariable );
 }
Créer un scope
1/3 : fonction anonyme

 function() {
    var privateVariable = true;
    console.log( privateVariable );
 }
=> parse error
Créer un scope
2/3 : parler gentiment au parser

( function() {
    var privateVariable = true;
    console.log( privateVariable );
})
=> rien
Créer un scope
3/3 : auto-exécution

( function() {
     var privateVariable = true;
     console.log( privateVariable );
})()
=> true
Application pratique

(function() {
     var privateVariable = true;
     window.init = function() {
          console.log( privateVariable );
     }
}())

init(); // true
console.log(privateVariable);//undefined
Morales

1 Toujours utiliser var
2 Utiliser le pattern module
Contexte


this = contexte d'exécution
Contexte


Démo « contexte »
Contexte - DOM
myClass = function() {
     this.id = 'myClass';
     this.getId = function() {
          console.log(this.id);
     };
};

myObject = new myClass();
document.body.onclick = myObject.getId;
// document.body.id
Contexte – fix portée
myClass = function() {
     this.id = 'myClass';
     var me = this;
     this.getId = function() {
        console.log(me.id);
     };
};
myObject = myClass();

document.body.onclick = myObject.action;
// 'myClass'
Contexte – fix portée

Démo du fix
Morales

1 Toujours utiliser var
2 Utiliser le pattern module
3 Verrouiller le contexte
Function()
Déclarations
● function action() {}




action = function() {}
●
Function()
Déclarations
● function action() {}




action = function() {}
●




Exécution
●

 action();
Function()



Un petit jeu ?
function action()
Le hoisting, c'est pratique


action(); // true

function action() {
    console.log(true);
}
function action()
Le hoisting, c'est dangereux
if( 1 === 1) {
  function action() {
    console.log('1 === 1');
  }
} else {
  function action() {
     console.log('1 !== 1');
  }
}
action(); // 1 !== 1
function action()
Implicitement sensible à la portée


(function() {
     function action() {
          console.log('action');
     }
}())
action(); // undefined
var action = function()


Plus explicite donc moins dangereux
Morales

1 Toujours utiliser var
2 Utiliser le pattern module
3 Verrouiller le contexte
4 déclarer ses fonction avec var
action = function() { }
Avant la Démo « mise en pratique »
    ●Utilisation des
écrasements de fonction
Utilisation des
     écrasements de fonction
var bind =
 function( el, ev, callback) {
  if(document.body.attachEvent){
         el.attachEvent('on'+ev, callback);
  } else {
         el.addEventListener( ev, callback);
     }
};

         Le test est fait à chaque exécution
return function()
var bind =
function( el, ev, callback) {
  if(document.body.attachEvent)
     return function(el, ev, callback) {
element.attachEvent('on'+event, callback);
     };
  else
      return function(el, ev, callback) {
   el.addEventListener( ev, callback);
      };
}();
Démo « mise en pratique »


Problème : écouter la liste d'éléments
Teasing : 17h30 amphi Havane


  OOJS, bonnes pratiques...
Conclusion


Javascript est différent, apprenez le
Questions ?
Jean-pierre VINCENT
braincracking.org
@theystolemynick


RDV maintenant :
stand Generative Objects
(N° 55 à côté HP)

Fondamentaux portée - contexte - function ms tech days

Notes de l'éditeur