2010-05-09 11 views
5

डीओएम के पास self नामक ऑब्जेक्ट क्यों है और दूसरा एक ही बात है जब window कहा जाता है? भ्रम की स्थिति window को जोड़ने के लिए एक संपत्ति self का आह्वान किया है ताकि:डीओएम में खिड़की और स्वयं दोनों क्यों हैं?

window === window.self === self 

क्यों इस तरह यह क्या है? मुझे किसका उपयोग करना चाहिए?

+0

आपको या तो संदर्भ देने की आवश्यकता क्यों है? 'विंडो' डीओएम का हिस्सा है, जबकि 'स्वयं' जावास्क्रिप्ट में वैश्विक वस्तु से संबंधित है, जो अधिकांश कार्यान्वयन में डोम की खिड़की के बराबर होता है। राइनो जैसे गैर-ब्राउज़र कार्यान्वयन में, 'स्वयं' मौजूद है, लेकिन 'विंडो' नहीं है क्योंकि कोई डोम नहीं है। –

+0

@ सेन: जावास्क्रिप्ट (ईसीएमएस्क्रिप्ट) मानक में 'self' प्रकट नहीं होता है। कार्यान्वयन के नाम पर वैश्विक वस्तु को विश्वसनीय रूप से एक्सेस करने के लिए, आपको वैश्विक संदर्भ (किसी भी कार्य के बाहर) में ऐसा कुछ निष्पादित करके इसे स्वयं नाम देना होगा: 'var global = this; 'यह काम करता है क्योंकि जब नियंत्रण में प्रवेश होता है वैश्विक संदर्भ कोड, 'यह' वैश्विक वस्तु को इंगित करता है। 'self' 'window.self' संदर्भ IMHO के बाहर वैश्विक वस्तु के नाम के रूप में कोई समझ नहीं लेता है। –

+0

@ टी.जे. बस उसी –

उत्तर

5

self जावास्क्रिप्ट पर्यावरण और अंक [वैश्विक] ऑब्जेक्ट के लिए द्वारा परिभाषित किया गया है (लेकिन कल्पना का हिस्सा नहीं है, इसलिए वहाँ नहीं हो सकता है) है, जबकि window डोम विनिर्देश का हिस्सा है। अधिकांश ब्राउज़रों में window का उपयोग [वैश्विक] ऑब्जेक्ट के रूप में किया जाता है, लेकिन यह हमेशा ऐसा नहीं होता है।

self == window.self अजीब नहीं है क्योंकि वे एक ही वस्तु हैं - जब self देखा जा रहा है, यह वैश्विक वस्तु (window) की संपत्ति के रूप में पाया जाता है। तो यह वास्तव में window.self == window.self जैसा ही है।

जैसा कि कहीं और उल्लेख किया गया है, विश्वसनीय संदर्भ [global] ऑब्जेक्ट के लिए, आपको वैश्विक निष्पादन संदर्भ में var global = this; चलाकर इसे अपने सीएफ को परिभाषित करना चाहिए।

+0

मैं समझता हूं कि दोनों एक ही वस्तु के पॉइंटर्स हैं। यह मुझे अजीब के रूप में पकड़ा गया कि डीओएम का एक वस्तु खुद ही संपत्ति के रूप में है क्योंकि यह स्पष्ट नहीं है कि क्यों कोई जानबूझकर ऐसा कुछ करने के लिए तैयार करेगा। – hekevintran

+2

यदि आप निष्पादन संदर्भों के बारे में जानते हैं तो यह अजीब नहीं है कि ईसीएमएस्क्रिप्ट में बनाया गया है। आखिरकार, 'स्वयं' संपत्ति को कहीं भी सुलभ अधिकार परिभाषित किया जाना चाहिए? और यह '[वैश्विक]' वस्तु की संपत्ति के रूप में ही है। यह संपत्ति वास्तव में '[वैश्विक]' वस्तु को इंगित करती है, वास्तव में यहां प्रासंगिक नहीं है। –

+0

तो क्या आप कह रहे हैं कि वैश्विक निष्पादन संदर्भ में 'स्वयं' 'var global = this; 'जैसा है? मुझे लगता है कि मेरा सवाल है: यदि ब्राउज़र हमें 'खिड़की' देता है तो 'स्वयं' क्यों मौजूद है? – hekevintran

1

जब आप self यह कॉल कर रहे हैं तो एक ही बात क्या कोई अन्य वैश्विक संपत्ति की तरहwindow.self है, (जैसे location वास्तव में window.location है)।

इसका कारण क्या है? आम तौर पर इस तरह के चेक के लिए:

if(window.top != window.self) { 
    alert("We're in a frame"); 
} 
+0

@ टी.जे. को जोड़ने वाला था। यदि 'window.top' और 'window.self' ने आपके जेएस में बड़े मुद्दों को बदल दिया है :) पहले चेक के लिए, हाँ आप' विंडो 'का उपयोग कर सकते हैं, लेकिन' window.self! = Window.top' है बहुत * स्पष्ट * मेरा बिंदु था :) –

+1

गोचा। (और प्रकार पर: हाँ, लेकिन हे, यह हो सकता है! 'Window.top =" मेंढक ";' ;-)) –

+1

@ टीजे।ओह यह निश्चित रूप से हो सकता है :) पुराना आईई आपको 'विंडो' ऑब्जेक्ट को फिर से परिभाषित करने देता है, अच्छे समय –

0

वैश्विक selfwindow.self के लिए एक शॉर्टकट है। वे दोनों एक ही वस्तु हैं।

क्यों वहाँ एक वेब पेज संदर्भ में दोनों window और self, कर रहे हैं के रूप में, self हमेशा (के रूप में तक मुझे पता है) window के बराबर है। लेकिन मुझे लगता है कि यह हमेशा ऐसा नहीं होना चाहिए - जावास्क्रिप्ट/ईसीएमएस्क्रिप्ट एक वेब पेज में उपयोग करने के लिए सीमित नहीं है जहां एक डोम है।

क्या उपयोग करना है, दोनों सामान्य वेब पेज संदर्भ AFAIK में उपयोग करने के लिए सुरक्षित होना चाहिए। window का उपयोग करने के लिए अच्छे तर्कों के लिए @ निक की टिप्पणी देखें।

+1

मैं व्यक्तिगत रूप से 'स्वयं' का उपयोग नहीं करता ... कई ढांचे/विविध कोड स्थानीय रूप से और संभावित रूप से स्थानीय चर के रूप में इसका उपयोग करते हैं बंद करने के लिए आप इसे खिला रहे हैं, इसलिए कुछ मामलों में 'स्वयं' * खिड़की नहीं हो सकता है। –

+0

@ निक अच्छे अंक, उन्हें प्रतिबिंबित करने के लिए मेरा जवाब संपादित किया। –

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