Puis-je accéder aux variables d'un autre fichier?

180

Est-il possible d'utiliser une variable dans un fichier appelé first.jsdans un autre fichier appelé second.js?

first.jscontient une variable appelée colorcodes.

SAK
la source
@Roki: Par exemple, vous pourriez charger des données à partir d'un autre site Web, alors que le script pour les traiter est sur votre site:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor a quitté le bâtiment le
le site de la source de données n'a pas de rappel? ce que je veux dire: télécharger second.js contient: ... function secondscriptFn (o) {// faire quelque chose / w données; } ... téléchargez datasource.example.net/first.js?callback=secondscriptFn puis contenez d' abord: secondscriptFn ({back: "# fff", front: "# 888", side: "# 369"}); plus contrôlable et robuste que les versions de portée globale, car vous pouvez contrôler la portée first.js ...
Roki
4
Juste une note si vous utilisez jQuery et que vous essayez de le faire. Vous devez vous assurer que vous ne mettez pas la variable à laquelle vous essayez d'accéder à partir du premier fichier dans la fonction '$ (document) .ready ()'; sinon, il ne se chargera pas correctement, du moins d'après mon expérience.
Collin McGuire

Réponses:

199

Comme l'a dit Fermin, une variable dans la portée globale devrait être accessible à tous les scripts chargés après sa déclaration. Vous pouvez également utiliser une propriété de windowou (dans la portée globale) thispour obtenir le même effet.

// first.js
var colorCodes = {

  back  : "#fff",
  front : "#888",
  side  : "#369"

};

... dans un autre fichier ...

// second.js
alert (colorCodes.back); // alerts `#fff`

... dans votre fichier html ...

<script type="text/javascript" src="first.js"></script> 
<script type="text/javascript" src="second.js"></script> 
Dagg Nabbit
la source
6
Dans un navigateur, window est la portée globale - donc window.colorCodes et l'objet (global) colorCodes est le même objet.
Piskvor a quitté le bâtiment le
C'est vrai ... la raison pour laquelle je le mentionne est pour les cas où vous devez définir une variable globale à partir d'une portée non globale.
Dagg Nabbit
2
et html? en html j'ai: <script>var variable1 = true;</script> <script src="first.js"></script>est-ce que first.js verra cette variable? Je l'ai testé dans l'extension Google Chrome et cela n'a pas fonctionné
user25
@ user25, j'ai le même problème, avez-vous trouvé une solution?
Mercury
2
Si vous utilisez eslint, vous pouvez ajouter /* global colorCodes */sur la ligne ci-dessus pour éviter le message d'erreur "... n'est pas défini"
Joseph K.
41

Vous pouvez exporter la variable du premier fichier à l'aide de l' exportation .

//first.js
const colorCode = {
    black: "#000",
    white: "#fff"
};
export { colorCode };

Ensuite, importez la variable dans le deuxième fichier à l'aide de l' importation .

//second.js
import { colorCode } from './first.js'

export - MDN

Germa Vinsmoke
la source
14

J'ai aimé ce que la réponse ci-dessus a dit mais même si cela n'a pas fonctionné avec moi

parce que j'étais declaringces variables insideJQuery$( document ).ready()

alors assurez-vous de déclarer vos variables dans la <script>balise pas ailleurs

Basheer AL-MOMANI
la source
13

Cela devrait fonctionner - définissez une variable globale dans firstfile et accédez-y à partir de secondfile:

<script src="/firstfile.js"></script>
<script src="/secondfile.js"></script>

firstfile.js:

var colors = {
   text:'#000000',
   background:'#aaaaaa',
   something_else:'blue'
};

secondfile.js:

do_something_with(colors.background);

Notez que l'ordre dans lequel vous chargez les fichiers de script est important pour certains navigateurs (IE6 bien sûr, peut-être pour d'autres)

Piskvor a quitté le bâtiment
la source
1
Vous devrez peut-être attacher cette variable à l'objet comme: this.colors = colors. Si c'est un objet plutôt qu'une énumération, vous pouvez créer une fonction pour simplement renvoyer la valeur. this.getTextColor = function () {return colors.text; };
aggaton
1
comment mettriez-vous à jour une variable à partir d'une page chargée? <script type = "text / javascript"> colors.background = "new col"; </script> ne semble pas fonctionner.
v3nt le
6

En utilisant Node.js, vous pouvez exporter la variable via le module.

//first.js
const colorCode = {
    black: "#000",
    white: "#fff"
};
module.exports = { colorCode };

Ensuite, importez le module / la variable dans le deuxième fichier à l'aide de require.

//second.js
const { colorCode } = require('./first.js')

Vous pouvez utiliser le importet une exportapproche depuis ES6 en utilisant Webpack / Babel, mais dans Node.js vous devez activer un indicateur et utiliser l'extension .mjs.

Xinton
la source
doit-il être un const pour l'exporter?
BKSpurgeon il y a
3

Je suis tombé sur amplify.js . C'est vraiment simple à utiliser. Pour stocker une valeur, appelons-la "myValue", vous faites:

amplify.store("myKey", "myValue")

Et pour y accéder, vous faites

amplify.store("myKey")
Ben Leitner
la source
2

Si vous stockez vos codes de couleur dans une variable globale, vous devriez pouvoir y accéder depuis l'un ou l'autre des fichiers javascript.

Fermin
la source
2

Je fais peut-être cela un peu différemment. Je ne sais pas pourquoi j'utilise cette syntaxe, je l'ai copiée à partir d'un livre il y a longtemps. Mais chacun de mes fichiers js définit une variable. Le premier fichier, sans aucune raison, s'appelle R:

    var R = 
    { 
        somevar: 0,
        othervar: -1,

        init: function() {
          ...
        } // end init function

        somefunction: function(somearg) {
          ...
        }  // end somefunction

        ...

    }; // end variable R definition


    $( window ).load(function() {
       R.init();
    })

Et puis si j'ai un gros morceau de code que je veux séparer, je le mets dans un fichier séparé et un nom de variable différent, mais je peux toujours référencer les variables et les fonctions R. J'ai appelé le nouveau TD sans aucune raison valable:

    var TD = 
    { 
        xvar: 0,
        yvar: -1,

        init: function() {
           ...
        } // end init function

        sepfunction: function() {
           ...
           R.somefunction(xvar);
           ...
        }  // end somefunction

        ...

    }; // end variable TD definition


    $( window ).load(function() {
       TD.init();
    })

Vous pouvez voir que là où, dans la «sepfunction» TD, j'appelle la fonction R.somefunction. Je me rends compte que cela ne donne aucune efficacité d'exécution car les deux scripts doivent être chargés, mais cela m'aide à garder mon code organisé.

Alan
la source
0

Une meilleure façon est d'utiliser window. ETAT INITIAL

<script src="/firstfile.js">
    // first.js
    window.__INITIAL_STATE__ = {
      back  : "#fff",
      front : "#888",
      side  : "#369"
    };
</script>
<script src="/secondfile.js">
    //second.js
    console.log(window.__INITIAL_STATE__)
    alert (window.__INITIAL_STATE__);
</script>
Karan Shaw
la source
Quel est l'avantage de cette approche par rapport aux autres réponses?
Boric