|<- [[jsfn:Using anonymous closures]]|[[jsfn:Creating and namespacing modules]] ->| === Déterminer le scope des variables === - scope : espace ou une variable est accessible - block scope : scope déterminer par des {} - function scope : scope déterminé par les limites d'une fonction. Toute fonction créé par avec le mot-clé **var** est locale au sein de la fonction. Une variable créée au sein d'une fonction parente est accessible au sein d'une fonction enfant. - chaine de scope (//scope chain//) : défini le comportement de javascript lorsqu'il ne peut trouver l'objet demandé dans la fonction actuelle : JavaScript va regarder dans les fonctions parentes - Toute variable créée sans le mot-clé **avr** est une variable **globale** : **danger** ! - variable definitions are hoisted (hissées, élevées). C'est à dire qu'au moment où le code est //processé//; JavaScript hisse les déclarations de variables en tête de bloc (mais pas les assignations !). Des variables peuvent donc exister avant même que vous les utilisiez. function chose() { var chose_nom = 'chaise'; function autre_chose() { //var chose_nom = 'table'; console.log('chose = '+chose_nom); // chose = chaise } autre_chose(); } chose(); ==hoisting exampe== function chose() { console.log('chose = '+chose_nom); // chose = undefined var chose_nom = 'chaise'; } chose(); Le code ici ne génère pas d'erreur : la déclaration est hissée en tête de bloc fonction et existe donc avec la valeur undefined lorsqu'elle est appelé avant d'être d'être assignée. En gros le code devient : function chose() { var chose_nom; console.log('chose = '+chose_nom); // chose = undefined chose_nom = 'chaise'; } chose(); Note : cela permet d'utiliser une fonction avant sa déclaration. **ça n'est pas pour autant une bonne pratique et peut amener d'autres problèmes !** ma_fonction(); function ma_fonction() { console.log("bonjour"); }