Czy mogę uzyskać dostęp do zmiennych z innego pliku?

179

Czy można użyć zmiennej w pliku o nazwie first.jswewnątrz innego pliku o nazwie second.js?

first.jszawiera zmienną o nazwie colorcodes.

SAK
źródło
@Roki: Na przykład możesz ładować dane z innej witryny internetowej, podczas gdy skrypt do ich przetwarzania znajduje się w Twojej witrynie:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor opuścił budynek
witryna źródła danych nie ma wywołania zwrotnego? co mam na myśli: pobierz second.js zawiera: ... function secondscriptFn (o) {// zrób coś / w danych; } ... Pobieranie datasource.example.net/first.js?callback=secondscriptFn następnie pierwszy zawierać: secondscriptFn ({powrotem: "# fff", przód: "# 888", z boku: "# 369"}); bardziej kontrolowalne i niezawodne niż wersje z zakresem globalnym, ponieważ możesz kontrolować zakres first.js ...
Roki,
4
Uwaga, jeśli używasz jQuery i próbujesz to zrobić. Musisz upewnić się, że zmienna, do której próbujesz uzyskać dostęp z pierwszego pliku, nie została umieszczona w funkcji „$ (dokument) .ready ()”; w przeciwnym razie nie załaduje się poprawnie, przynajmniej z mojego doświadczenia.
Collin McGuire

Odpowiedzi:

198

Jak powiedział Fermin, zmienna o zasięgu globalnym powinna być dostępna dla wszystkich skryptów ładowanych po jej zadeklarowaniu. Możesz także użyć właściwości windowor (w zakresie globalnym), thisaby uzyskać ten sam efekt.

// first.js
var colorCodes = {

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

};

... w innym pliku ...

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

... w Twoim pliku html ...

<script type="text/javascript" src="first.js"></script> 
<script type="text/javascript" src="second.js"></script> 
Dagg Nabbit
źródło
6
W przeglądarce window jest zasięgiem globalnym - więc window.colorCodes i (globalny) obiekt colorCodes to ten sam obiekt.
Piskvor opuścił budynek
To prawda ... powód, dla którego o tym wspominam, dotyczy przypadków, w których musisz ustawić zmienną globalną z zakresu nieglobalnego.
Dagg Nabbit
2
a co z html? w html mam: <script>var variable1 = true;</script> <script src="first.js"></script>czy first.js zobaczy tę zmienną? Przetestowałem to w rozszerzeniu Google Chrome i nie zadziałało
25
@ user25, mam ten sam problem, czy znalazłeś rozwiązanie?
Merkury,
2
Jeśli używasz eslint, możesz dodać /* global colorCodes */w powyższym wierszu, aby zapobiec komunikatowi o błędzie „... nie jest zdefiniowany”
Joseph K.
41

Możesz wyeksportować zmienną z pierwszego pliku za pomocą eksportu .

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

Następnie zaimportuj zmienną do drugiego pliku za pomocą importu .

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

eksport - MDN

Germa Vinsmoke
źródło
14

Podobała mi się powyższa odpowiedź , ale mimo to nie zadziałała

bo ja byłem declaringtymi zmiennymi insideJQuery$( document ).ready()

więc upewnij się, że deklarujesz swoje zmienne wewnątrz <script>tagu, a nie gdzie indziej

Basheer AL-MOMANI
źródło
13

To powinno działać - zdefiniuj zmienną globalną w firstfile i uzyskaj do niej dostęp z 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);

Zwróć uwagę, że kolejność, w jakiej ładujesz pliki skryptów, ma znaczenie dla niektórych przeglądarek (na pewno IE6, może inne)

Piskvor opuścił budynek
źródło
1
Może być konieczne dołączenie tej zmiennej do obiektu, na przykład: this.colors = colors. Jeśli jest to obiekt, a nie wyliczenie, możesz utworzyć funkcję, aby po prostu zwracała wartość. this.getTextColor = function () {return colors.text; };
aggaton
1
jak zaktualizować zmienną z załadowanej strony? <script type = "text / javascript"> colors.background = "nowa kolumna"; </script> wydaje się nie działać.
v3nt
6

Za pomocą Node.js możesz wyeksportować zmienną za pośrednictwem modułu.

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

Następnie zaimportuj moduł / zmienną w drugim pliku za pomocą require.

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

Możesz użyć importi exportaproach z ES6 używając Webpack / Babel, ale w Node.js musisz włączyć flagę i użyć rozszerzenia .mjs.

Xinton
źródło
3

Natknąłem się na amplify.js . To naprawdę proste w użyciu. Aby zapisać wartość, nazwijmy ją „myValue”:

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

Aby uzyskać do niego dostęp, masz

amplify.store("myKey")
Ben Leitner
źródło
2

Jeśli przechowujesz kody kolorów w zmiennej globalnej, powinieneś mieć do niej dostęp z dowolnego pliku javascript.

Fermin
źródło
2

Może robię to trochę inaczej. Nie jestem pewien, dlaczego używam tej składni, skopiowałem ją z jakiejś książki dawno temu. Ale każdy z moich plików js definiuje zmienną. Pierwszy plik, bez żadnego powodu, nosi nazwę 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();
    })

A potem, jeśli mam duży fragment kodu, który chcę posegregować, umieszczam go w osobnym pliku i pod inną nazwą zmiennej, ale nadal mogę odwoływać się do zmiennych i funkcji języka R. Zadzwoniłem do nowego TD bez żadnego powodu:

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

Widać, że w miejscu, w którym w „funkcji” TD nazywam funkcję R. Zdaję sobie sprawę, że nie zapewnia to żadnej wydajności w czasie wykonywania, ponieważ oba skrypty muszą zostać załadowane, ale pomaga mi to uporządkować kod.

Alan
źródło
0

Najlepszym sposobem jest użycie okna. STAN POCZĄTKOWY

<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
źródło
Jaka jest przewaga tego podejścia nad innymi odpowiedziami?
Boric