2012-07-20 7 views
14

विशिष्ट वस्तु में संग्रहीत वैश्विक चर हैं? उदाहरण के लिए:जावास्क्रिप्ट वैश्विक चर किस संग्रह में संग्रहीत हैं?

var test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

सभी इन परीक्षणों के तीन, undefined में परिणाम तो वहाँ एक वस्तु है कि इन चर रखती है?

मुझे लगता है कि यह कुछ बेवकूफ है कि मुझे पहले से ही पता होना चाहिए, लेकिन मुझे ऑनलाइन जवाब भी नहीं मिल रहा है।

+3

संक्षिप्त उत्तर: आप वैश्विक चर का संदर्भ कैसे देते हैं, यह आपके पर्यावरण पर निर्भर करता है। –

+1

"पर्यावरण" से आपका क्या मतलब है? ब्राउज़र, दायरा, ओएस? – twiz

+0

जावास्क्रिप्ट ब्राउज़र में, पुराने फ़ोटोशॉप में, पुराना वीआरएमएल ब्राउज़र में चला सकता है, इंजन के भीतर आप जावा प्रोग्राम और कई अन्य होस्ट सिस्टम में एम्बेड कर सकते हैं। हम इन्हें "मेजबान वातावरण" कहते हैं। तो हाँ, यह एक ब्राउज़र हो सकता है। जावास्क्रिप्ट प्रोग्राम इन वातावरण से वस्तुओं का उपयोग करते हैं। –

उत्तर

15

मुझे लगता है कि आपको अधिकतर ब्राउज़रों पर मिल जाएगा, window में संग्रहीत हैं।

सुदूर मनोविज्ञान डीबगिंग प्रयास: क्या आपने इसका परीक्षण जेएसएफडल में किया था? या शायद फायरबग में? यदि ऐसा है, तो आप शायद तीनों के लिए undefined देख रहे हैं क्योंकि उस स्थिति में कोड को फ्रेम में निष्पादित किया गया है; तो यह एक अलग window वस्तु (मुझे लगता है कि) कोड वास्तव में लपेटा जाता है है:

window.addEvent('load', function() { 
    var test="stuff"; 
    console.log(window.test); 
    console.log(document.test); 
    console.log(this.test); 
}); 

आप jsFiddle से ऊपर टुकड़ा है कि testनहीं एक वैश्विक चर है, जो बताता है कि क्यों यह hasn है से देख सकते हैं window से जुड़ा हुआ नहीं है।

मैं कोई विशेषज्ञ नहीं हूं, लेकिन यह उत्तर क्रोम, फ़ायरफ़ॉक्स, सफारी और ओपेरा में जो कुछ भी बता सकता है उससे सटीक प्रतीत होता है। सत्यापित करने के लिए, मैं निम्नलिखित सामग्री के साथ एक HTML फ़ाइल बनाया है और प्रत्येक ब्राउज़र में लोड:

<script type="text/javascript"> 
    var test = "stuff"; 
    alert(window.test); 
</script> 

पर्याप्त ज़रूर, "सामान" हर बार।

+0

मुझे पता था कि एक कारण था कि मैंने सोचा था "यह कुछ बेवकूफ है जिसे मुझे पहले से ही पता होना चाहिए"। आप बिल्कुल सही हैं, मैं jsFiddle का उपयोग कर रहा था ... मुझे अपनी मूर्खता की दिशा में इंगित करने के लिए धन्यवाद। हाहा – twiz

+3

बेवकूफ होने से दूर, यह एक अच्छा सवाल था। –

+0

मैं रे के साथ हूँ; यह निश्चित रूप से एक अच्छा सवाल है। असल में यह विचित्र है जितना मैं इसके बारे में सोचता हूं कि यह उत्तर वास्तव में सच है। Jsfiddle internals में खुदाई के लिए –

5

एक "सत्य" वैश्विक चर में "var" कीवर्ड नहीं है। इस प्रयास करें:

test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 
इस के साथ

, सभी कार्यक्षेत्रों इसे देखेंगे। Var कीवर्ड वाले वैरिएबल उन दायरे के लिए स्थानीय हैं जिन्हें घोषित किया गया था।

एक चर "विंडो से वैश्विक" (विंडो ऑब्जेक्ट की संपत्ति) केवल तभी होगा जब आप इसे खिड़की के दायरे में घोषित करते हैं, जैसा कि दान ने कहा था, जो इसे वैश्विक ब्राउज़र के रूप में आमतौर पर विंडो का उपयोग करने वाले ब्राउज़र पर वैश्विक बनाता है।

+1

एक "सत्य" वैश्विक? यदि आप वैश्विक क्षेत्र में 'var' का उपयोग करते हैं तो यह वैश्विक चर बनाता है। – nnnnnn

+0

@nnnnnn डबल कोट्स का उपयोग जानबूझकर था;) – davidbuzatto

+0

दिलचस्प। मैंने jsfiddle में यह कोशिश की, और इसके बजाय मुझे "सामान", "अपरिभाषित", "सामान" मिला। और पहला और आखिरी वही है क्योंकि 'यह === विंडो'। http: // jsfiddle।नेट/5Xtaq/1/ –

2

ग्लोबल वेरिएबल वैश्विक window चर में संग्रहीत हैं। निम्नलिखित कोड काम करता है अगर आप बस इसे बाहर कुछ भी (एक समारोह की तरह) की घोषणा:

var test="stuff"; 
console.log(window.test); 

समान सबूत है कि window.location.href रूप location.href

हालांकि एक ही है, समस्या जहां चर घोषित किया गया था पर झूठ कर सकते हैं । उदाहरण के लिए, यदि आप समारोह में इस चर घोषित, यह केवल समारोह में मौजूद नहीं होगा, और न विश्व स्तर पर:

function foo(){ 

    //declaring inside function 
    var test="stuff"; 

    //undefined, since the variable exists in the function only 
    console.log(window.test); 

    //undefined, document refers to the document 
    //which is the top DOM object, not the global window 
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function 
    //For normal function calls, usually it points to window as well 
    console.log(this.test); 

    //none of the above refer to "test" that contains "stuff" 
    //because you are looking in the wrong place 

} 
+0

यह 'var' कीवर्ड है, [@davidbuzatto] (http://stackoverflow.com/a/11573012/143295) की अच्छी आंख थी। – Nicole

17

यहाँ एक देर से लेकिन तकनीकी जवाब है।

आप

पूछना वैश्विक चर विशिष्ट वस्तु में संग्रहीत कर रहे हैं?

उत्तर हाँ है; वे आधिकारिक तौर पर वैश्विक वस्तु नामक किसी चीज़ में संग्रहीत हैं। इस ऑब्जेक्ट को official ECMAScript 5 Specification की धारा 15.1 में वर्णित किया गया है।

वैश्विक वस्तु का नाम रखने की आवश्यकता नहीं है; लेकिन आप इसके गुणों का उपयोग करके String, isNaN, और Date जैसे गुणों का उल्लेख कर सकते हैं। आपका जावास्क्रिप्ट होस्ट वातावरण ईसीएमएस्क्रिप्ट विनिर्देश, जैसे कि alert या console द्वारा आवश्यक वस्तुओं के अलावा वैश्विक ऑब्जेक्ट में अन्य गुण रखेगा। एक ब्राउज़र में, मैं स्क्रिप्ट

alert("Hello world"); 

लिख सकते हैं क्योंकि alert वैश्विक वस्तु की एक संपत्ति है।

ध्यान दें कि इस वैश्विक वस्तु को एक्सेस करने का कोई तरीका नहीं है, विश्वास करो या नहीं। हालांकि, अच्छी बात यह है कि कई मेजबान वातावरण वैश्विक वस्तु में एक संपत्ति डाल देंगे जिसका मूल्य वैश्विक वस्तु का संदर्भ है। अधिकांश वेब ब्राउज़र में, इस संपत्ति को window कहा जाता है। तो हम लिख सकते हैं:

alert("Hello"); 
window.alert("Hello"); 
window.window.alert("Hello"); 
window.window.window.window.window.alert("Hello"); 

और आप भी कह सकते हैं:

var x = 5; 
alert(this.x); 

और 5 सतर्क कर दिया मिलता है।

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