Tôi có thể truy cập các biến từ một tập tin khác không?


178

Có thể sử dụng một biến trong một tệp được gọi first.jsbên trong một tệp khác được gọi là second.js?

first.jschứa một biến được gọi là colorcodes.


@Roki: Ví dụ: bạn có thể đang tải dữ liệu từ một trang web khác, trong khi tập lệnh để xử lý chúng nằm trên trang web của bạn:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor rời khỏi tòa nhà vào

trang web nguồn dữ liệu không có một cuộc gọi lại? ý tôi là: download second.js chứa: ... hàm secondcriptFn (o) {// làm gì đó / w dữ liệu; } ... download datasource.example.net/first.js?callback=secondscriptFn thì trước tiên bao gồm: secondscriptFn ({trở lại: "# fff", phía trước: "# 888", bên: "# 369"}); dễ điều khiển và mạnh mẽ hơn các phiên bản phạm vi toàn cầu, bởi vì bạn có thể kiểm soát phạm vi First.js ...
Roki

4
Cũng như một lưu ý nếu bạn đang sử dụng jQuery và bạn đang cố gắng làm điều này. Bạn cần đảm bảo rằng bạn không đặt biến mà bạn đang cố truy cập từ tệp đầu tiên trong hàm '$ (tài liệu). Đã ()'; nếu không nó sẽ không tải đúng cách, ít nhất là từ kinh nghiệm của tôi.
Collin McGuire

Câu trả lời:


195

Như Fermin đã nói, một biến trong phạm vi toàn cầu sẽ có thể truy cập được đối với tất cả các tập lệnh được tải sau khi được khai báo. Bạn cũng có thể sử dụng một thuộc tính của windowhoặc (trong phạm vi toàn cầu) thisđể có được hiệu ứng tương tự.

// first.js
var colorCodes = {

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

};

... trong một tập tin khác ...

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

... trong tệp html của bạn ...

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

5
Trong một trình duyệt, window phạm vi toàn cầu - vì vậy window.colorCodes và đối tượng (toàn cầu) colorCodes là cùng một đối tượng.
Piskvor rời khỏi tòa nhà vào

Đúng ... lý do tôi đề cập đến là trong trường hợp bạn cần đặt biến toàn cục từ phạm vi không toàn cầu.
Dagg Nợi

2
còn html thì sao? trong html tôi có: <script>var variable1 = true;</script> <script src="first.js"></script>First.js sẽ thấy biến đó chứ? Tôi đã thử nghiệm nó trong tiện ích mở rộng của Google Chrome và nó không hoạt động
user25

@ user25, tôi có cùng một vấn đề, bạn đã tìm ra giải pháp chưa?
Sao Thủy

1
Nếu bạn đang sử dụng eslint, bạn có thể thêm /* global colorCodes */vào dòng trên để ngăn thông báo lỗi "... không được xác định"
Joseph K.

41

Bạn có thể xuất biến từ tệp đầu tiên bằng cách xuất .

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

Sau đó, nhập biến trong tệp thứ hai bằng cách nhập .

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

xuất - MDN


14

Tôi đã làm như những gì câu trả lời ở trên đã nói nhưng mặc dù, nó không hoạt động với tôi

vì tôi là declaringcác biến insideJQuery$( document ).ready()

vì vậy hãy chắc chắn rằng bạn khai báo các biến của bạn bên trong <script>thẻ chứ không phải nơi nào khác


13

Điều này sẽ hoạt động - xác định một biến toàn cục trong tệp đầu tiên và truy cập nó từ tệp thứ hai:

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

Lưu ý rằng thứ tự bạn tải các tệp tập lệnh có ý nghĩa đối với một số trình duyệt (chắc chắn IE6, có thể là các trình duyệt khác)


1
Bạn có thể cần phải gắn biến đó vào đối tượng như: this.colors = colors. Nếu nó là một đối tượng chứ không phải enum, bạn có thể tạo một hàm để chỉ trả về giá trị. this .getTextColor = function () {return colors.text; };
aggaton

1
Làm thế nào bạn sẽ cập nhật một biến từ một trang được tải? <script type = "text / javascript"> colors.background = "new col"; </ script> dường như không hoạt động.
v3nt

6

Sử dụng Node.js bạn có thể xuất biến thông qua mô-đun.

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

Sau đó, nhập mô-đun / biến trong tệp thứ hai bằng cách sử dụng yêu cầu.

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

Bạn có thể sử dụng importexportaproach từ ES6 bằng Webpack / Babel, nhưng trong Node.js, bạn cần bật cờ và sử dụng tiện ích mở rộng .mjs.


3

Tôi đã đi qua amplify.js . Nó thực sự đơn giản để sử dụng. Để lưu trữ một giá trị, hãy gọi nó là "myValue", bạn làm:

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

Và để truy cập nó, bạn làm

amplify.store("myKey")

2

Nếu bạn lưu trữ mã màu của mình trong một biến toàn cục, bạn sẽ có thể truy cập nó từ tệp javascript.


2

Tôi có thể làm điều này một chút khác nhau. Tôi không chắc tại sao tôi sử dụng cú pháp này, sao chép nó từ một số cuốn sách từ lâu. Nhưng mỗi tệp js của tôi định nghĩa một biến. Tệp đầu tiên, không có lý do nào cả, được gọi là 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();
    })

Và sau đó nếu tôi có một đoạn mã lớn mà tôi muốn tách riêng, tôi đặt nó vào một tệp riêng và một tên biến khác, nhưng tôi vẫn có thể tham chiếu các biến và hàm R. Tôi đã gọi một TD mới mà không có lý do chính đáng nào cả:

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

Bạn có thể thấy rằng trong vị trí của TD 'tôi gọi là R.somefeft. Tôi nhận ra rằng điều này không mang lại hiệu quả trong thời gian chạy vì cả hai tập lệnh cần tải, nhưng nó giúp tôi giữ mã của mình được tổ chức.


0

Một cách tốt nhất là sử dụng cửa sổ. TRẠNG THÁI BAN ĐẦU

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

Ưu điểm của phương pháp này so với các câu trả lời khác là gì?
Boric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.