ฉันสามารถเข้าถึงตัวแปรจากไฟล์อื่นได้หรือไม่?


179

เป็นไปได้หรือไม่ที่จะใช้ตัวแปรในไฟล์ที่เรียกว่าfirst.jsภายในไฟล์อื่นที่เรียกว่าsecond.js?

first.jscolorcodesมีตัวแปรที่เรียกว่า


@Roki: ตัวอย่างเช่นคุณสามารถโหลดข้อมูลจากเว็บไซต์อื่นในขณะที่สคริปต์เพื่อดำเนินการอยู่ในเว็บไซต์ของคุณ:<script src="http://datasource.example.net/first.js"></script><script src="second.js"></script>
Piskvor ออกจากอาคาร

ไซต์แหล่งข้อมูลไม่มีการติดต่อกลับหรือไม่ สิ่งที่ฉันหมายถึง: ดาวน์โหลด second.js ประกอบด้วย: ... ฟังก์ชั่น secondscriptFn (o) {// ทำบางสิ่ง / ข้อมูล w; } ... ดาวน์โหลดdatasource.example.net/first.js?callback=secondscriptFnจากนั้นก่อนจะมี: secondscriptFn ({back: "# fff", ด้านหน้า: "# 888", ด้าน: "# 369"}); สามารถควบคุมได้และมีประสิทธิภาพมากกว่ารุ่นขอบเขตทั่วโลกเนื่องจากคุณสามารถควบคุมขอบเขต first.js ...
Roki

4
เช่นเดียวกับบันทึกย่อหากคุณใช้ jQuery และคุณพยายามทำเช่นนี้ คุณต้องแน่ใจว่าคุณไม่ได้ใส่ตัวแปรที่คุณพยายามเข้าถึงจากไฟล์แรกในฟังก์ชั่น '$ (document) .ready ()'; มิฉะนั้นมันจะไม่โหลดอย่างถูกต้องอย่างน้อยจากประสบการณ์ของฉัน
Collin McGuire

คำตอบ:


198

ดังที่ Fermin กล่าวว่าตัวแปรในขอบเขตทั่วโลกควรจะสามารถเข้าถึงได้โดยสคริปต์ทั้งหมดที่โหลดหลังจากมีการประกาศ คุณสามารถใช้คุณสมบัติของwindowหรือ (ในขอบเขตทั่วโลก) thisเพื่อให้ได้ผลเหมือนกัน

// first.js
var colorCodes = {

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

};

... ในไฟล์อื่น ...

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

... ในไฟล์ html ของคุณ ...

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

6
ในเบราว์เซอร์window เป็นขอบเขตทั่วโลก - เพื่อ window.colorCodes และ colorCodes (ทั่วโลก) วัตถุวัตถุเดียวกัน
Piskvor ออกจากอาคาร

จริง ... เหตุผลที่ฉันพูดถึงเป็นกรณีที่คุณต้องตั้งค่าตัวแปรส่วนกลางจากขอบเขตที่ไม่ใช่ทั่วโลก
Dagg Nabbit

2
แล้ว html ล่ะ ใน html ฉันมี: <script>var variable1 = true;</script> <script src="first.js"></script>first.js จะเห็นตัวแปรนั้นหรือไม่ ฉันทดสอบในส่วนขยายของ Google Chrome แต่ไม่ได้ผล
25

@ user25 ฉันมีปัญหาเดียวกันคุณหาวิธีแก้ไขหรือไม่?
พุธ

2
หากคุณกำลังใช้ eslint คุณสามารถเพิ่ม/* global colorCodes */ในบรรทัดด้านบนเพื่อป้องกันข้อผิดพลาด "... ไม่ได้กำหนด" ข้อความแสดงข้อผิดพลาด
Joseph K.

41

คุณสามารถส่งออกตัวแปรจากไฟล์แรกที่ใช้การส่งออก

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

จากนั้นนำเข้าตัวแปรในแฟ้มที่สองโดยใช้การนำเข้า

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

ส่งออก - MDN



13

สิ่งนี้ควรใช้งานได้ - กำหนดตัวแปรโกลบอลใน firstfile และเข้าถึงจาก 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);

โปรดทราบว่าลำดับที่คุณโหลดไฟล์สคริปต์นั้นมีความสำคัญสำหรับเบราว์เซอร์บางตัว (แน่นอนว่า IE6 อาจจะเป็นอื่น ๆ )


1
คุณอาจต้องแนบตัวแปรนั้นกับวัตถุเช่น: this.colors = colors หากเป็นวัตถุแทนที่จะเป็น enum คุณสามารถสร้างฟังก์ชันเพื่อคืนค่า this.getTextColor = function () {return colors.text; };
aggaton

1
คุณจะปรับปรุงตัวแปรจากหน้าที่โหลดได้อย่างไร <script type = "text / javascript"> colors.background = "new col"; </script> ดูเหมือนจะไม่ทำงาน
v3nt

6

การใช้ Node.js คุณสามารถส่งออกตัวแปรผ่านโมดูล

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

จากนั้นนำเข้าโมดูล / ตัวแปรในไฟล์ที่สองโดยใช้ต้องใช้

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

คุณสามารถใช้importและexportaproach จาก ES6 โดยใช้ Webpack / Babel แต่ใน Node.js คุณต้องเปิดใช้งานการตั้งค่าสถานะและใช้ส่วนขยาย. mjs


3

ฉันมาข้ามamplify.js มันใช้งานง่ายมาก ในการจัดเก็บค่าลองเรียกมันว่า "myValue" คุณต้อง:

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

และเพื่อเข้าถึงคุณทำ

amplify.store("myKey")

2

หากคุณเก็บรหัสสีของคุณในตัวแปรทั่วโลกคุณควรจะสามารถเข้าถึงได้จากไฟล์จาวาสคริปต์


2

ฉันอาจทำสิ่งนี้แตกต่างไปเล็กน้อย ฉันไม่แน่ใจว่าทำไมฉันถึงใช้ไวยากรณ์นี้คัดลอกมาจากหนังสือบางเล่มเมื่อนานมาแล้ว แต่ไฟล์ js ของฉันแต่ละไฟล์จะกำหนดตัวแปร ไฟล์แรกโดยไม่มีเหตุผลเลยเรียกว่า 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();
    })

แล้วถ้าฉันมีรหัสชิ้นใหญ่ที่ฉันต้องการแยกฉันใส่มันในไฟล์แยกต่างหากและชื่อตัวแปรที่แตกต่างกัน แต่ฉันยังสามารถอ้างอิงตัวแปร R และฟังก์ชั่น ฉันเรียก TD ใหม่ว่าไม่มีเหตุผลที่ดีเลย:

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

คุณจะเห็นว่าใน 'การแยกเสียงรบกวน' ของ TD ฉันเรียกว่า R.somefunction ฉันรู้ว่าสิ่งนี้ไม่ได้ให้ประสิทธิภาพรันไทม์ใด ๆ เพราะสคริปต์ทั้งสองต้องโหลด แต่มันช่วยฉันจัดการโค้ดของฉันให้เป็นระเบียบ


0

วิธีที่ดีที่สุดคือใช้หน้าต่าง 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>

อะไรคือข้อดีของวิธีนี้มากกว่าคำตอบอื่น ๆ ?
Boric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.