Maison  >  Article  >  interface Web  >  Les déclarations de fonction dans les instructions conditionnelles peuvent-elles conduire à un comportement inattendu en JavaScript ?

Les déclarations de fonction dans les instructions conditionnelles peuvent-elles conduire à un comportement inattendu en JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 21:26:30459parcourir

Can Function Declarations Within Conditional Statements Lead to Unexpected Behavior in JavaScript?

Déclarations de fonctions dans les instructions conditionnelles : une étude de cas

Cette question tourne autour du comportement des déclarations de fonction lorsqu'elles sont imbriquées dans des instructions if/else. Traditionnellement en JavaScript, les déclarations de fonctions étaient hissées et avaient une portée globale, quelle que soit leur position physique dans le code. En mode strict ES5, les déclarations de fonctions étaient limitées à la portée de niveau supérieur ou au sein des fonctions. Le mode non strict avait un comportement imprévisible, entraînant des incohérences entre les navigateurs.

Dans l'exemple fourni :

<code class="js">var abc = '';
if (1 === 0) {
  function a() {
    abc = 7;
  }
} else if ('a' === 'a') {
  function a() {
    abc = 19;
  }
} else if ('foo' === 'bar') {
  function a() {
    abc = 'foo';
  }
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'</code>

Dans JavaScript moderne (ES2015 et versions ultérieures), les déclarations de fonctions dans les blocs sont désormais autorisées. . Cependant, ils sont limités au bloc dans lequel ils sont déclarés. Cela signifie que dans l'exemple ci-dessus :

  • S'il s'exécute dans un environnement ES5 strict, le code générera une erreur car les fonctions ne peuvent pas être déclarées à l'intérieur des blocs.
  • S'il s'exécute dans dans un environnement ES5 non strict, différents navigateurs peuvent avoir des comportements différents.
  • Dans un environnement ES2015, la fonction a sera déclarée dans le cadre de chaque instruction if. Par conséquent, lorsque a() est appelé, il accédera à la variable abc déclarée dans la portée globale et lui attribuera la valeur 'foo' (la valeur attribuée dans l'instruction else if finale).

À Si vous définissez des fonctions de manière conditionnelle, il est recommandé d'utiliser des expressions de fonction plutôt que des déclarations de fonction. Cela garantit que la portée de la fonction est explicitement définie et prévisible.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn