35 votes

Pourquoi est var x x x x Plus complet que var x x {}?

Dans mon efforce d'écrire propre code Javascript en tant que débutant, j'ai récemment été la lecture de cet article sur namespacing en JavaScript quand je suis tombé sur ce paragraphe:

Le code tout en haut de l'échantillon suivant montre les différentes façons dont vous pouvez vérifier pour voir si une variable (objet de l'espace de noms) existe déjà avant de le définir. Vous verrez régulièrement des développeurs à l'aide de l'Option 1, mais des Options 3 et 5 peuvent être considérées comme plus approfondie et l'Option 4 est considéré comme une bonne pratique.

// This doesn't check for existence of 'myApplication' in
// the global namespace. Bad practice as you can easily
// clobber an existing variable/namespace with the same name
var myApplication = {};

/*
The following options *do* check for variable/namespace existence.
If already defined, we use that instance, otherwise we assign a new
object literal to myApplication.

Option 1: var myApplication = myApplication || {};
Option 2  if(!MyApplication) MyApplication = {};
Option 3: var myApplication = myApplication = myApplication || {}
Option 4: myApplication || (myApplication = {});
Option 5: var myApplication = myApplication === undefined ? {} : myApplication;

*/

L'Option 1 est certainement celui que j'ai vu utilisé la plupart du temps, et je le comprends bien.

L'Option 2 est bien, mais semble manquer d'un var myApplication à l'avance ou un if(!window.myApplication) si myApplication n'est pas dans la portée globale de l'état if(!myApplication) serait jeter une erreur, ne serait-il pas?

L'Option 3 est celui que j'ai de la difficulté avec ma compréhension est que l' myApplication = myApplication est exécuté en premier, avec myApplication dans la portée globale (en raison de l' var au début). Mon problème est que je ne peux pas penser à un cas où cette option n'est rien de plus que l'option 1.

L'Option 4 , à mes yeux, aurait été mieux écrit window.myApplication || (myApplication = {}) afin d'éviter de jeter une erreur s' myApplication n'est pas dans la portée globale.

L'Option 5 est l'exclusion de la fausse-y les valeurs autres que d' undefined mais est-ce une bonne idée? Si myApplication est-à-dire une chaîne vide, le reste du code est susceptible d'échouer, n'est-ce pas?

Quelqu'un pour être en mesure de faire la lumière sur les différences entre les différentes options et, en particulier, expliquer pourquoi l'option 3 est décrit comme plus approfondie?

54voto

T.J. Crowder Points 285826

Si l'article prétend l'Option 3 est "plus approfondie," il est incorrect. Il n'y a pas de point au milieu de la cession de la chaîne à tous.

Quelqu'un pour être en mesure de faire la lumière sur les différences entre les différentes options et, en particulier, expliquer pourquoi l'option 3 est décrit comme plus approfondie?

Tout d'abord, une mise en garde: Ici à 2018, vous ne voulez probablement pas à utiliser l'un de ces. Au lieu de cela, utiliser les bons modules, soit par l'intermédiaire de l'un des divers module de définition de syntaxes (AMD, CommonJS, RequireJS) avec un outil pertinent, ou via ES2015+ modules avec import et export (et probablement un outil pertinent comme Babel et peut-être Webpack ou Browserify, bien que les versions de google Chrome, Safari, et le Bord de modules de prise en charge en mode natif, et Firefox le fait actuellement derrière un drapeau).

Pourquoi est - var x = x = x || {} plus approfondie que d' var x = x || {}?

Il n'est pas.

L'Option 2 est bien, mais semble manquer d'un var myApplication à l'avance ou un if(!window.myApplication) si myApplication n'est pas dans la portée globale de l'état if(!myApplication) serait jeter une erreur, ne serait-il pas?

Oui. (En supposant que la production se fait à la portée globale. si ce n'est pas à une portée globale et il y a un champ d'application myApplication n'importe où dans le champ d'application actuel de la chaîne, il ne lèvera pas parce qu' myApplication ne sera pas un symbole non résolu.)

L'Option 3 est celui que j'ai de la difficulté avec ma compréhension est que l' myApplication = myApplication est exécuté en premier, avec myApplication dans la portée globale (en raison de l' var au début). Mon problème est que je ne peux pas penser à un cas où cette option n'est rien de plus que l'option 1.

Non, si vous avez

var myApplication = myApplication = myApplication || {}

c'est l'ordre dans lequel les choses se passent:

  1. var myApplication crée la mondiale s'il n'existe pas déjà, et qu'il laisse intact s'il n'
  2. myApplication || {} est évaluée et prend soit la valeur en myApplication (si c'est truthy) ou {} (si non); appelons que value1
  3. myApplication = value1 (celui du milieu) est effectuée, et le résultat est value1
  4. myApplication = value1 (celle de gauche) est à nouveau exécutée pour aucune bonne raison

L'Option 4 , à mes yeux, aurait été mieux écrit window.myApplication || (myApplication = {}) afin d'éviter de jeter une erreur s' myApplication n'est pas dans la portée globale.

En effet.

L'Option 5 est l'exclusion de la fausse-y les valeurs autres que d' undefined mais est-ce une bonne idée? Si myApplication est-à-dire une chaîne vide, le reste du code est susceptible d'échouer, n'est-ce pas?

Oui.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X