J'ai demandé ici: node.js nécessite l'héritage?
et on m'a dit que je peux définir des variables à la portée globale en omettant la var.
Cela ne fonctionne pas pour moi.
c'est à dire:
_ = require('underscore');
Ne rend pas le _ disponible sur les fichiers requis. Je peux régler avec expressapp.set
et les avoir disponibles ailleurs cependant.
Quelqu'un peut-il confirmer que cela est censé fonctionner? Merci.
javascript
node.js
express
Harry
la source
la source
exports
. C'est beaucoup mieux.Réponses:
Vous pouvez utiliser
global
comme ceci:la source
window
est l'objet global.document
est une propriété dewindow
.Dans le nœud, vous pouvez définir des variables globales via l'objet "global" ou "GLOBAL":
ou plus utilement ...
Depuis la source du nœud, vous pouvez voir que ceux-ci sont aliasés les uns aux autres:
Dans le code ci-dessus, "ceci" est le contexte global. Avec le système de modules commonJS (que le nœud utilise), l'objet "this" à l'intérieur d'un module (c'est-à-dire "votre code") n'est PAS le contexte global. Pour en avoir la preuve, voir ci-dessous où je crache l'objet "this" puis l'objet géant "GLOBAL".
** Remarque: en ce qui concerne le réglage "GLOBAL._", en général, vous devez simplement le faire
var _ = require('underscore');
. Oui, vous le faites dans chaque fichier qui utilise le soulignement, tout comme vous le faites en Javaimport com.foo.bar;
. Cela facilite la compréhension de ce que fait votre code car les liens entre les fichiers sont «explicites». Légèrement ennuyeux, mais une bonne chose. .... C'est la prédication.Il y a une exception à chaque règle. J'ai eu exactement exactement UNE instance où je devais définir "GLOBAL._". Je créais un système pour définir des fichiers "config" qui étaient essentiellement JSON, mais qui étaient "écrits en JS" pour permettre un peu plus de flexibilité. De tels fichiers de configuration n'avaient pas d'instructions 'require', mais je voulais qu'ils aient accès au trait de soulignement (le système ENTIRE était basé sur les modèles de soulignement et de soulignement), donc avant d'évaluer la "config", je définirais "GLOBAL._". Alors oui, pour chaque règle, il y a une exception quelque part. Mais vous feriez mieux d'avoir une sacrée bonne raison et pas seulement "je suis fatigué de taper" require "donc je veux rompre avec la convention".
la source
.js
fichier normal et appelerrequire
avant d'exporter les configurations?Les autres solutions qui utilisent le mot clé GLOBAL sont un cauchemar pour maintenir / lisibilité (+ pollution de l'espace de noms et bugs) lorsque le projet s'agrandit. J'ai vu cette erreur plusieurs fois et j'ai eu les tracas de la réparer.
Utilisez un fichier JS puis utilisez les exportations de module.
Exemple:
globals.js
Ensuite, si vous souhaitez les utiliser, utilisez require.
la source
globals.domain
si vous changiez?Qu'en est-il d'un espace de noms global comme
global.MYAPI = {}
Modifier après le commentaire de camilo-martin : Toutes les autres affiches parlent du mauvais schéma impliqué. Donc, en laissant cette discussion de côté, la meilleure façon d'avoir une variable définie globalement (question OP) est à travers les espaces de noms.
@tip: http://thanpol.as/javascript/development-using-namespaces
la source
require
! Il est correct d'utiliser des espaces de noms, mais ne faites pas toutglobal.foo = global.foo || {}
sur tous les fichiers ou quelque chose. Exigez le fichier qui définit l'espace de noms. Faites-le pour les enfants.Vous pouvez simplement utiliser l'objet global.
la source
Je suis d'accord que l'utilisation de l'espace de noms global / GLOBAL pour définir quelque chose de global est une mauvaise pratique et ne l'utilise pas du tout en théorie ( en théorie étant le mot clé). Cependant (oui, l'opérateur) je l'utilise pour définir des classes d'erreur personnalisées:
Oui, tabou ici, mais si votre site / projet utilise des erreurs personnalisées partout, vous devrez essentiellement le définir partout, ou au moins quelque part pour:
La définition de mes erreurs personnalisées dans l'espace de noms global m'évite d'avoir à demander ma bibliothèque d'erreurs client. L'imagerie lançant une erreur personnalisée lorsque cette erreur personnalisée n'est pas définie.
De plus, si cela ne va pas, faites-le moi savoir car je viens juste de commencer à le faire récemment
la source