Bisakah saya mengakses variabel dari file lain?

179

Apakah mungkin untuk menggunakan variabel dalam file yang disebut first.jsdi dalam file lain yang disebut second.js?

first.jsberisi variabel yang disebut colorcodes.

SAK
sumber
@Roki: Misalnya, Anda dapat memuat data dari situs web lain, sementara skrip untuk memprosesnya ada di situs Anda:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor meninggalkan gedung
situs sumber data tidak memiliki panggilan balik? apa yang saya maksud: unduh second.js berisi: ... function secondscriptFn (o) {// do something / w data; } ... download datasource.example.net/first.js?callback=secondscriptFn maka pertama berisi: secondscriptFn ({kembali: "# fff", depan: "# 888", side: "# 369"}); lebih terkendali dan kuat daripada versi lingkup global, karena Anda dapat mengontrol lingkup first.js ...
Roki
4
Sama seperti catatan jika Anda menggunakan jQuery dan Anda mencoba melakukan ini. Anda perlu memastikan bahwa Anda tidak meletakkan variabel yang Anda coba akses dari file pertama di fungsi '$ (dokumen) .ready ()'; kalau tidak, itu tidak akan dimuat dengan benar, setidaknya dari pengalaman saya.
Collin McGuire

Jawaban:

198

Seperti yang dikatakan Fermin, variabel dalam lingkup global harus dapat diakses oleh semua skrip yang dimuat setelah dideklarasikan. Anda juga bisa menggunakan properti windowatau (dalam lingkup global) thisuntuk mendapatkan efek yang sama.

// first.js
var colorCodes = {

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

};

... di file lain ...

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

... di file html Anda ...

<script type="text/javascript" src="first.js"></script> 
<script type="text/javascript" src="second.js"></script> 
Dagg Nabbit
sumber
6
Di browser, window adalah ruang lingkup global - jadi window.colorCodes dan objek (global) colorCodes adalah objek yang sama.
Piskvor meninggalkan gedung
Benar ... alasan saya menyebutkannya adalah untuk kasus-kasus di mana Anda perlu mengatur variabel global dari lingkup non-global.
Dagg Nabbit
2
bagaimana dengan html? di html saya punya: <script>var variable1 = true;</script> <script src="first.js"></script>akan first.js melihat variabel itu? Saya mengujinya dalam ekstensi Google Chrome dan tidak berhasil
user25
@ user25, saya punya masalah yang sama, apakah Anda menemukan solusi?
Merkurius
2
Jika Anda menggunakan eslint, Anda dapat menambahkan /* global colorCodes */pada baris di atas untuk mencegah pesan kesalahan "... tidak didefinisikan"
Joseph K.
41

Anda dapat mengekspor variabel dari file pertama menggunakan ekspor .

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

Kemudian, impor variabel dalam file kedua menggunakan impor .

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

ekspor - MDN

Germa Vinsmoke
sumber
14

Saya memang suka apa jawaban di atas tetapi meskipun, itu tidak berhasil dengan saya

karena saya adalah declaringvariabel-variabel ini insideJQuery$( document ).ready()

jadi pastikan Anda mendeklarasikan variabel Anda di dalam <script>tag bukan di tempat lain

Basheer AL-MOMANI
sumber
13

Ini seharusnya berfungsi - mendefinisikan variabel global di firstfile dan mengaksesnya dari 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);

Perhatikan bahwa urutan Anda memuat file skrip penting untuk beberapa browser (IE6 pasti, mungkin yang lain)

Piskvor meninggalkan gedung
sumber
1
Anda mungkin perlu melampirkan variabel itu ke objek seperti: this.colors = colors. Jika ini merupakan objek daripada enum, Anda bisa membuat fungsi untuk hanya mengembalikan nilai. this.getTextColor = function () {return colors.text; };
aggaton
1
bagaimana Anda memperbarui variabel dari halaman yang dimuat? <script type = "text / javascript"> colors.background = "new col"; </script> sepertinya tidak berfungsi.
v3nt
6

Menggunakan Node.js Anda dapat mengekspor variabel melalui modul.

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

Kemudian, impor modul / variabel dalam file kedua menggunakan wajib.

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

Anda dapat menggunakan importdan exportpendekatan dari ES6 menggunakan Webpack / Babel, tetapi di Node.js Anda harus mengaktifkan flag, dan menggunakan ekstensi .mjs.

Xinton
sumber
apakah itu harus menjadi const untuk mengekspornya?
BKSpurgeon
3

Saya menemukan amplify.js . Ini sangat mudah digunakan. Untuk menyimpan nilai, sebut saja "myValue", Anda melakukannya:

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

Dan untuk mengaksesnya, Anda lakukan

amplify.store("myKey")
Ben Leitner
sumber
2

Jika Anda menyimpan kode warna dalam variabel global, Anda harus dapat mengaksesnya dari file javascript.

Fermin
sumber
2

Saya mungkin melakukan ini sedikit berbeda. Saya tidak yakin mengapa saya menggunakan sintaks ini, menyalinnya dari beberapa buku dulu. Tetapi masing-masing file js saya mendefinisikan variabel. File pertama, tanpa alasan sama sekali, disebut 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();
    })

Dan kemudian jika saya memiliki sepotong besar kode yang ingin saya pisahkan, saya meletakkannya di file yang terpisah dan nama variabel yang berbeda, tetapi saya masih bisa merujuk variabel R dan fungsi. Saya menelepon TD baru tanpa alasan sama sekali:

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

Anda dapat melihat bahwa di mana dalam TD 'sepfungsi' saya memanggil fungsi R. Saya menyadari ini tidak memberikan efisiensi runtime karena kedua skrip perlu memuat, tetapi itu membantu saya menjaga kode saya terorganisir.

Alan
sumber
0

Salah satu cara terbaik adalah dengan menggunakan jendela. INITIAL_STATE

<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
sumber
Apa keuntungan dari pendekatan ini dibanding jawaban lain?
Boric