Posso accedere alle variabili da un altro file?


180

È possibile utilizzare una variabile in un file chiamato first.jsall'interno di un altro file chiamato second.js?

first.jscontiene una variabile chiamata colorcodes.


@Roki: Ad esempio, potresti caricare dati da un altro sito Web, mentre lo script per elaborarli è sul tuo sito:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor ha lasciato l'edificio il

il sito dell'origine dati non ha un callback? cosa intendo: download second.js contiene: ... function secondscriptFn (o) {// fare qualcosa / w dati; } ... scarica datasource.example.net/first.js?callback=secondscriptFn quindi prima contiene: secondscriptFn ({back: "# fff", fronte: "# 888", lato: "# 369"}); più controllabile e robusto rispetto alle versioni di ambito globali, perché è possibile controllare l'ambito first.js ...
Roki

4
Proprio come una nota se stai usando jQuery e stai provando a farlo. Devi assicurarti di non inserire la variabile a cui stai tentando di accedere dal primo file nella funzione '$ (document) .ready ()'; altrimenti non si caricherà correttamente, almeno dalla mia esperienza.
Collin McGuire,

Risposte:


199

Come ha detto Fermin, una variabile nell'ambito globale dovrebbe essere accessibile a tutti gli script caricati dopo che è stata dichiarata. È inoltre possibile utilizzare una proprietà windowo (nell'ambito globale) thisper ottenere lo stesso effetto.

// first.js
var colorCodes = {

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

};

... in un altro file ...

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

... nel tuo file html ...

<script type="text/javascript" src="first.js"></script> 
<script type="text/javascript" src="second.js"></script> 

6
In un browser, window è l'ambito globale, quindi window.colorCodes e l'oggetto (globale) colorCodes è lo stesso oggetto.
Piskvor lasciò l'edificio il

Vero ... il motivo per cui menziono è per i casi in cui è necessario impostare una variabile globale da un ambito non globale.
Dagg Nabbit,

2
che dire di html? in HTML ho: <script>var variable1 = true;</script> <script src="first.js"></script>first.js vedrà quella variabile? L'ho provato con l'estensione Google Chrome e non ha funzionato
user25

@utente25, ho lo stesso problema, hai trovato una soluzione?
Mercurio,

2
Se stai usando eslint, puoi aggiungere /* global colorCodes */nella riga sopra per evitare il messaggio di errore "... non definito"
Joseph K.

41

Puoi esportare la variabile dal primo file usando export .

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

Quindi, importa la variabile nel secondo file usando import .

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

esportazione - MDN


14

Mi è piaciuta la risposta di cui sopra, ma sebbene non abbia funzionato con me

perché ero declaringqueste variabili insideJQuery$( document ).ready()

quindi assicurati di dichiarare le tue variabili all'interno del <script>tag non altrove


13

Questo dovrebbe funzionare: definire una variabile globale nel primo file e accedervi dal secondo file:

<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);

Si noti che l'ordine in cui si caricano i file di script è significativo per alcuni browser (IE6 sicuramente, forse altri)


1
Potrebbe essere necessario collegare quella variabile all'oggetto come: this.colors = colors. Se è un oggetto anziché un enum, puoi creare una funzione per restituire semplicemente il valore. this.getTextColor = function () {return colors.text; };
aggaton

1
come aggiorneresti una variabile da una pagina caricata? <script type = "text / javascript"> colors.background = "new col"; </script> non sembra funzionare.
v3nt,

6

Utilizzando Node.js è possibile esportare la variabile tramite il modulo.

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

Quindi, importare il modulo / la variabile nel secondo file usando request.

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

Puoi usare importe exportaproach da ES6 usando Webpack / Babel, ma in Node.js devi abilitare un flag e usare l'estensione .mjs.


deve essere una const per esportarla?
BKSpurgeon

3

Mi sono imbattuto in amplify.js . È davvero semplice da usare. Per memorizzare un valore, chiamiamolo "myValue", si fa:

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

E per accedervi, lo fai

amplify.store("myKey")

2

Se memorizzi i tuoi colorcodes in una variabile globale dovresti essere in grado di accedervi da entrambi i file javascript.


2

Potrei farlo in modo leggermente diverso. Non sono sicuro del motivo per cui utilizzo questa sintassi, l'ho copiata da qualche libro molto tempo fa. Ma ognuno dei miei file js definisce una variabile. Il primo file, per nessun motivo, si chiama 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();
    })

E poi se ho un grosso pezzo di codice che voglio segregare, lo metto in un file separato e con un nome di variabile diverso, ma posso ancora fare riferimento alle variabili R e alle funzioni. Ho chiamato il nuovo TD senza una buona ragione:

    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();
    })

Potete vedere che in "sepfunction" del TD chiamo R.somefunction. Mi rendo conto che questo non fornisce alcuna efficienza di runtime perché entrambi gli script devono essere caricati, ma mi aiuta a mantenere organizzato il mio codice.


0

Un modo migliore è usare la finestra. STATO INIZIALE

<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>

Qual è il vantaggio di questo approccio rispetto alle altre risposte?
Boric
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.