Le scope est l'ensemble des variables accessibles dans un bloc de code
On a 2 types de scopes :

  • global
  • local

Le scope global est l'ensemble des variables accessibles dans le script
Le scope local est l'ensemble des variables accessibles dans un bloc de code

const age = 20;
function sayHello() {
    const name = 'John';
    console.log(`Hello ${name}, you are ${age} years old`);
}

// console.log(`Hello ${name}, you are ${age} years old`); // erreur, name n'est pas accessible ici

Différences entre var, let et const

1. VAR - Function scoped

function testVar() {
    if (true) {
        var x = 1;
    }
    console.log(x); // 1 - accessible car var est function-scoped
}

2. LET - Block scoped

function testLet() {
    if (true) {
        let y = 1;
    }
    // console.log(y); // erreur - y n'est pas accessible ici
}

3. CONST - Block scoped, non-reassignable

function testConst() {
    const z = 1;
    // z = 2; // erreur - const ne peut pas être réassigné
}

Hoisting

Hoisting avec var

console.log(hoistedVar); // undefined (pas d'erreur)
var hoistedVar = "Je suis hoisted";

Hoisting avec let/const

// console.log(hoistedLet); // erreur - ReferenceError
let hoistedLet = "Je ne suis pas accessible avant déclaration";

Redéclaration

var a = 1;
var a = 2; // OK avec var

let b = 1;
// let b = 2; // erreur avec let

Exemples pratiques de scopes

Global scope

var globalVar = "Je suis global";
let globalLet = "Moi aussi";
const globalConst = "Moi aussi";

function scopeExample() {
    // Function scope
    var functionVar = "Je suis dans la fonction";
    let functionLet = "Moi aussi";
    const functionConst = "Moi aussi";
    
    if (true) {
        // Block scope
        var blockVar = "Je suis accessible partout dans la fonction";
        let blockLet = "Je ne suis accessible que dans ce bloc";
        const blockConst = "Moi aussi";
        
        console.log(globalVar, functionVar, blockVar); // Tous accessibles
        console.log(blockLet, blockConst); // Accessibles dans le bloc
    }
    
    console.log(blockVar); // Accessible car var est function-scoped
    // console.log(blockLet); // erreur - pas accessible hors du bloc
    // console.log(blockConst); // erreur - pas accessible hors du bloc
}

Boucles et closures

console.log("=== Exemple avec boucles ===");

// Avec var - problème classique
for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log("var:", i), 100); // affiche 3, 3, 3
}

// Avec let - comportement attendu
for (let j = 0; j < 3; j++) {
    setTimeout(() => console.log("let:", j), 200); // affiche 0, 1, 2
}

Temporal Dead Zone

function temporalDeadZone() {
    console.log("Début de la fonction");
    // console.log(tempLet); // ReferenceError - Temporal Dead Zone
    let tempLet = "Maintenant je suis accessible";
    console.log(tempLet);
}

Objets et const

const obj = { name: "John" };
obj.name = "Jane"; // OK - on modifie le contenu, pas la référence
obj.age = 25; // OK
// obj = {}; // erreur - on ne peut pas réassigner

const arr = [1, 2, 3];
arr.push(4); // OK - on modifie le contenu
// arr = []; // erreur - on ne peut pas réassigner