2009-06-03 13 views
76

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

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

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

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

कोई मुझे बता सकते हैं अगर यह संभव है या वहाँ के चारों ओर एक काम इस लक्ष्य को हासिल करने के लिए है?

उत्तर

84

बस एक समारोह दायरे से बाहर 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> 

आप कर सकते थे, ज़ाहिर है, स्क्रिप्ट का लिंक बस से पहले बंद करने < शरीर > -tag टैग करता है अगर तुम नहीं है js-फ़ाइलों का भार प्रारंभिक पृष्ठ लोड बाधित करने के लिए चाहते हैं।

+4

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

+1

सहमत हुए। मैं हमेशा छेड़छाड़ और संघर्ष से बचने के लिए एक सामान्य "नेमस्पेस" में सभी कार्यों और चरों को गुंजाइश करने का प्रयास करता हूं। आम तौर पर मैं इसे परियोजना या कंपनी के उत्थान के रूप में नामित करता हूं। – PatrikAkerstrand

+0

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

6

क्या आपने इसे आजमाया है?

यदि आप कार्य करें:

var HI = 'Hello World'; 

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

alert(HI); 

js1.js में यह यह ठीक सूचित करेंगे। आपको HTML दस्तावेज़ में बाकी से पहले global.js शामिल करना होगा।

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

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

2

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

var globalvar1 = 'value'; 

आप अन्य फाइलों में बाद में उन तक पहुँच सकते, यह भी।

78

सिफारिश की दृष्टिकोण है:

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 scoped वैश्विक var या ठीक इसके विपरीत पीटना नहीं करता है के लिए इस वाक्य का मानकीकरण। उदाहरण के लिए यहाँ क्या होता है अस्पष्ट है:

 

greeting = "Aloha"; 

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

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

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

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

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

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

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

क्या इस प्रकार की घोषणा एक्स-ब्राउज़र काम करेगी? – nottinhill

+0

विंडो में चर को जोड़ना सभी ब्राउज़रों में काम करना चाहिए (और यह भी दृष्टिकोण है कि मैं लेता हूं, +1!)। – Dandy

+1

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

3

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

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

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

/** 
* 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", {}); 

यह थोड़ा अधिक टाइपिंग है, लेकिन यह अपने वैश्विक चर प्रबंधन भविष्य प्रूफ बना देता है।

अस्वीकरण: stacktrace.js के पिछले संस्करणों को देखते समय इस विचार का हिस्सा मेरे पास आया। मुझे लगता है कि रन-टाइम पर्यावरण के अधिक विश्वसनीय और कम हैकिश का पता लगाने के लिए कोई भी बोवर या अन्य टूल्स का उपयोग कर सकता है।

संबंधित मुद्दे