JavaScript Détermination de la fonction


Exemple

Lorsque vous définissez une fonction, elle crée une portée .

Tout ce qui est défini dans la fonction n'est pas accessible par code en dehors de la fonction. Seul le code de cette étendue peut voir les entités définies dans la portée.

function foo() {
  var a = 'hello';
  console.log(a);  // => 'hello'
}

console.log(a);  // reference error

Les fonctions imbriquées sont possibles en JavaScript et les mêmes règles s'appliquent.

function foo() {
  var a = 'hello';
  
  function bar() {
    var b = 'world';
    console.log(a);  // => 'hello'
    console.log(b);  // => 'world'
  }

  console.log(a);  // => 'hello'
  console.log(b);  // reference error
}

console.log(a);  // reference error
console.log(b);  // reference error

Lorsque JavaScript tente de résoudre une référence ou une variable, il commence à le rechercher dans la portée actuelle. Si elle ne parvient pas à trouver cette déclaration dans le champ d’application actuel, elle l’accède à un objectif. Ce processus se répète jusqu'à ce que la déclaration ait été trouvée. Si l'analyseur JavaScript atteint la portée globale et ne parvient toujours pas à trouver la référence, une erreur de référence sera générée.

var a = 'hello';

function foo() {
  var b = 'world';

  function bar() {
    var c = '!!';

    console.log(a);  // => 'hello'
    console.log(b);  // => 'world'
    console.log(c);  // => '!!'
    console.log(d);  // reference error
  }
}

Ce comportement d'escalade peut également signifier qu'une référence peut "ombrer" une référence nommée de la même manière dans la portée externe depuis sa première apparition.

var a = 'hello';

function foo() {
  var a = 'world';

  function bar() {
    console.log(a);  // => 'world'
  }
}
6

La façon dont JavaScript résout la portée s'applique également au mot clé const . Déclarer une variable avec le mot-clé const implique que vous n'êtes pas autorisé à réaffecter la valeur, mais la déclarer dans une fonction créera une nouvelle étendue et avec cela une nouvelle variable.

function foo() {
  const a = true;

  function bar() {
    const a = false;  // different variable
    console.log(a);   // false
  }

  const a = false;    // SyntaxError
  a = false;          // TypeError
  console.log(a);     // true
}

Cependant, les fonctions ne sont pas les seuls blocs qui créent une étendue (si vous utilisez let ou const ). let déclarations let et const ont une portée de l'instruction de bloc la plus proche. Voir ici pour une description plus détaillée.