web-dev-qa-db-fra.com

Quelle est la signification des accolades "{" "}" autour de ce code de bibliothèque React?

Je parcourais le code de la bibliothèque React. Après avoir parcouru, j'ai trouvé un morceau de code spécial, je ne peux pas comprendre sa signification. Quelqu'un peut-il aider?

var validateFormat = function () {};

{
  validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

Voici pourquoi le développeur React a enveloppé le validateFormat entre accolades? y a-t-il une signification à le faire?.

Si je fais ce qui suit, cela fonctionne de la même manière -

var validateFormat = function () {};

validateFormat = function (format) {
   if (format === undefined) {
   throw new Error('invariant requires an error message argument');
   }
};
18
abhishek gangwar

La portée du bloc est le résultat de leur babel-preset-fbjs . Si vous regardez la source d'origine , vous constaterez qu'à la place, cette fonction est conditionnellement définie en fonction de la valeur de __DEV__, qui est optimisé lors de la transpilation car il est équivalent à process.env.NODE_ENV !== 'production' .

let validateFormat = () => {};

if (__DEV__) {
  validateFormat = function(format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}
27
Patrick Roberts

Ce code est parfaitement logique.

var v = function () {};

{
  v = function (format) {
    // actual code
  };
}

La première affectation définit v à une fonction d'espace réservé vide afin que le code ne se casse pas.

La deuxième affectation contient le code réel de la fonction. Il est à l'intérieur d'un portée de bloc, qui est une construction JS légitime.

Mais ... l'étendue des blocs ne fait rien à cause du hissage variable, qui annule toute localité contrairement aux attentes des adeptes de C/C++. Beaucoup disent qu'il n'y a pas de portée de bloc dans JS, ce qui est faux. Il y a une portée de bloc mais elle est inefficace (à part les déclarations let/const plus récentes).

Donc, ce code fait abuser de la syntaxe du bloc inefficace pour séparer visuellement les parties du code.

Mais (et c'est ce que je pense se passe ici) ce que nous voyons ici est juste un EXEMPLE . Je pourrais très bien trouver un autre exemple parfaitement logique, comme celui-ci:

var v = function () {};

{
  let localValue = 0;

  v = function (format) {
    // actual code using localValue
    localValue = 1;
  };
}

En d'autres termes, vous pouvez trouver d'autres exemples dans la base de code qui exploite l'étendue des blocs à travers let/const et encapsule la définition comme indiqué. L'exemple que vous donnez ne tire tout simplement pas parti de cette opportunité, mais la portée reste la suivante:

  • il ne perturbe ni ne casse le code;
  • uniformité;
  • à l'avenir, le poids pourrait être plus élevé en ajoutant let/const.

C'est tout deviner de ma part.

3
pid

Les accolades sont ici instruction de bloc . Ils ne servent à rien dans ce cas et peuvent être omis en toute sécurité. Block scope ne fonctionne pas avec var. Même si c'était let, l'instruction de bloc ne l'affecterait pas car validateFormat est déjà défini en dehors de l'instruction de bloc.

Un exemple où l'instruction de bloc est utile serait:

let validateFormat = function () {};

{
  // doesn't reassign validateFormat from outer scope
  let validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
  // validateFormat from block scope is used here
}

// validateFormat from outer scope is used here

La réponse fournit une explication techniquement correcte. Le vrai problème ici est que la question contient un code incorrect qui n'a pas de sens car l'instruction if (...) a été omise lors du collage du code, comme le montre la réponse acceptée.

0
Estus Flask