.Js फ़ाइल में वैश्विक चर कैसे घोषित करें


86

मुझे कुछ वैश्विक चर चाहिए जो मुझे सभी .jsफाइलों में चाहिए।

उदाहरण के लिए, निम्नलिखित 4 फाइलों पर विचार करें:

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

क्या कोई ऐसा तरीका है जिसे मैं 3 वैश्विक चर घोषित कर सकता हूं global.jsऔर किसी अन्य 3 .jsफ़ाइलों में से किसी एक में उन्हें एक्सेस करने पर विचार कर सकता हूं। मैं उपरोक्त सभी 4 फाइलों को एक HTML दस्तावेज़ में लोड करता हूं?

क्या कोई मुझे बता सकता है कि क्या यह संभव है या इसे प्राप्त करने के लिए कोई काम है?

जवाबों:


95

बस एक कार्यक्षेत्र के बाहर global.js में अपने चर को परिभाषित करें:

// global.js
var global1 = "I'm a global!";
var global2 = "So am I!";

// other js-file
function testGlobal () {
    alert(global1);
}

यह सुनिश्चित करने के लिए कि यह कार्य आपको उस फ़ाइल में परिभाषित किसी भी चर को एक्सेस करने का प्रयास करने से पहले Global.js में शामिल / लिंक करना है:

<html>
    <head>
        <!-- Include global.js first -->
        <script src="/YOUR_PATH/global.js" type="text/javascript"></script>
        <!-- Now we can reference variables, objects, functions etc. 
             defined in global.js -->
        <script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script>
    </head>
    [...]
</html>

यदि आप प्रारंभिक पृष्ठ लोड को बाधित करने के लिए js-files का लोड नहीं चाहते हैं, तो आप निश्चित रूप से बंद होने से पहले स्क्रिप्ट टैग में लिंक कर सकते हैं।


4
हालांकि यह उत्तर सही है, मैं आपको सलाह दूंगा कि आप बेहतर समझ पाने के लिए Google जावास्क्रिप्ट वैरिएबल स्कोपिंग करें और संभवतः इस सटीक तरीके से काम करने से बचें।
अपराह्न

1
माना। मैं हमेशा अव्यवस्था और संघर्ष से बचने के लिए सभी कार्यों और चर को एक "सामान्य नाम" में रखने की कोशिश करता हूं। आमतौर पर मैं इसे परियोजना या कंपनी के नामकरण के रूप में देखता हूं।
पेट्रीकस्ट्रैन्ड

इस उत्तर को और दूसरों को इसे पसंद करते हुए क्योंकि यह मानता है कि वैश्विक चर वैश्विक दायरे में बनने जा रहा है, और इसके लिए यह भी आवश्यक है कि चर का पहला उल्लेख अन्य सभी उल्लेखों से पहले वैश्विक दायरे में हो।
एंड्रयू

1
@ और यह उत्तर आठ साल पहले लिखा गया था। सभी इरादों और उद्देश्यों के लिए, यह तब वापस सही था। यदि आप वास्तव में योगदान करना चाहते हैं, तो आप इसके बजाय एक संपादन का सुझाव देना चाह सकते हैं?
पैट्रिकअकेस्ट्रास्ट

@PatrikAkerstrand डेटिंग से वास्तव में कोई फर्क नहीं पड़ता। वैश्विक वस्तु का उपयोग करने वाले अन्य उत्तर पर्याप्त हैं; मैंने समझाया कि ऐसा क्यों नहीं है।
एंड्रयू

89

अनुशंसित दृष्टिकोण है:

window.greeting = "Hello World!"

फिर आप इसे किसी भी फ़ंक्शन के भीतर एक्सेस कर सकते हैं:

function foo() {

   alert(greeting); // Hello World!
   alert(window["greeting"]); // Hello World!
   alert(window.greeting); // Hello World! (recommended)

}

यह दृष्टिकोण दो कारणों से पसंद किया जाता है।

  1. आशय स्पष्ट है। के उपयोग varकीवर्ड आसानी से वैश्विक घोषित करने का कारण बन सकता varsहै कि विपरीत स्थानीय या उपाध्यक्ष के रूप में भेजा गया था। इस तरह का वैरिएबल स्कूपिंग बहुत सारे जावास्क्रिप्ट डेवलपर्स के लिए भ्रम की स्थिति है। इसलिए एक सामान्य नियम के रूप में, मैं यह सुनिश्चित करता हूं कि सभी चर घोषणाएं कीवर्ड varया उपसर्ग से पहले हो window

  2. आप इस तरह से चर को पढ़ने के लिए इस सिंटैक्स का मानकीकरण करते हैं, जिसका अर्थ है कि एक स्थानीय रूप से स्कोप किया varगया वैश्विक रूप से स्पष्ट नहीं हैvar या इसके विपरीत नहीं है। उदाहरण के लिए यहाँ क्या होता है अस्पष्ट है:

 

 greeting = "Aloha";

 function foo() {
     greeting = "Hello"; // overrides global!
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // does it alert "Hello" or "Howdy" ?

हालाँकि, यह बहुत अधिक क्लीनर और कम त्रुटि वाला है (आपको वास्तव में सभी परिवर्तनीय नियम याद रखने की आवश्यकता नहीं है):

 function foo() {
     window.greeting = "Hello";
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // alerts "Howdy"

विंडो में वैरिएबल संलग्न करना सभी ब्राउज़रों में काम करना चाहिए (और यह भी है कि मैं ले रहा हूं, +1!)।
डेंडी

1
@, यदि आप "var testvar = 'हैलो' घोषित करते हैं;" किसी फ़ंक्शन के बाहर, यह स्वचालित रूप से विंडो ऑब्जेक्ट में जोड़ा जाता है और आप इसे "window.testvar" के साथ एक्सेस कर सकते हैं।
18

1
@zkent, यह सही है, लेकिन विंडो ऑब्जेक्ट का उपयोग करना अभी भी बेहतर है cuz u आपके कोड को बाद में कॉफी की तरह sth में बदलना चाह सकता है।
नमि वं।

क्या दस्तावेज़ उपसर्ग के बजाय विंडो का उपयोग करना बेहतर है?
एंड्रयू

7

या तुमने कोशिश की?

यदि तुम करो:

var HI = 'Hello World';

में global.js। और फिर करें:

alert(HI);

इसमें js1.jsवह बारीक अलर्ट करेगा। आपको बस global.jsHTML दस्तावेज़ में बाकी को शामिल करना होगा।

एकमात्र पकड़ यह है कि आपको इसे खिड़की के दायरे में घोषित करना होगा (किसी भी कार्य के अंदर नहीं)।

आप बस इस varभाग को निक्स कर सकते हैं और उन्हें इस तरह से बना सकते हैं, लेकिन यह अच्छा अभ्यास नहीं है।


7

जैसा कि ऊपर उल्लेख किया गया है, आपकी स्क्रिप्ट फ़ाइल में सबसे अधिक गुंजाइश का उपयोग करने के साथ समस्याएं हैं। यहां एक और मुद्दा है: स्क्रिप्ट फ़ाइल को उस संदर्भ से चलाया जा सकता है जो कुछ रन-टाइम वातावरण में वैश्विक संदर्भ नहीं है।

इसे windowसीधे वैश्विक को सौंपने का प्रस्ताव किया गया है । लेकिन वह भी रन-टाइम निर्भर है और नोड आदि में काम नहीं करता है। यह बताता है कि पोर्टेबल ग्लोबल वैरिएबल मैनेजमेंट को कुछ सावधान विचार और अतिरिक्त प्रयास की जरूरत है। शायद वे भविष्य के ECMS संस्करणों में इसे ठीक कर देंगे!

अभी के लिए, मैं सभी रन-टाइम वातावरण के लिए उचित वैश्विक प्रबंधन का समर्थन करने के लिए कुछ इस तरह की सिफारिश करूंगा:

/**
 * Exports the given object into the global context.
 */
var exportGlobal = function(name, object) {
    if (typeof(global) !== "undefined")  {
        // Node.js
        global[name] = object;
    }
    else if (typeof(window) !== "undefined") {
        // JS with GUI (usually browser)
        window[name] = object;
    }
    else {
        throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
    }
};


// export exportGlobal itself
exportGlobal("exportGlobal", exportGlobal);

// create a new global namespace
exportGlobal("someothernamespace", {});

यह थोड़ा अधिक टाइपिंग है, लेकिन यह आपके वैश्विक वैरिएबल प्रबंधन को भविष्य का प्रमाण बनाता है।

डिस्क्लेमर: इस विचार का एक हिस्सा मेरे पास तब आया जब स्टैकट्रेस.जे के पिछले संस्करणों को देख रहा था ।

मुझे लगता है, रन-टाइम वातावरण के अधिक विश्वसनीय और कम हैकिंग का पता लगाने के लिए कोई भी वेबपैक या अन्य टूल का उपयोग कर सकता है।


2
GLOBALअब पदावनत कर दिया गया है, और globalइसका उपयोग किया जाना चाहिए।
थॉमस

2

हाँ आप उन तक पहुँच सकते हैं। आपको उन्हें 'सार्वजनिक स्थान' (किसी भी कार्य के बाहर) के रूप में घोषित करना चाहिए:

var globalvar1 = 'value';

आप उन्हें बाद में, अन्य फ़ाइलों में भी एक्सेस कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.