2010-07-22 7 views
30
में स्वयं का उपयोग करने के

मैंने देखा है कि जैसे कॉल setTimeout() काम या तो के रूप में:जब जावास्क्रिप्ट

self.keyword()

या सिर्फ अपने स्वयं के उदाहरण पर keyword()

दो कॉल के बीच क्या अंतर है?

+0

कृपया देखें http://stackoverflow.com/questions/3216428/self-property-in-javascript – pramodc84

+0

यह http://stackoverflow.com/questions/3216428/self-keyword-in-javascript – PSK

उत्तर

28

self विंडो ऑब्जेक्ट को संदर्भित कर सकता है, लेकिन आमतौर पर यह मामला यहां नहीं है। आप आमतौर पर कि setTimeout() ऊपर इस देखेंगे:

var self = this; 

वे वर्तमान वस्तु के लिए एक संदर्भ रख रहे हैं, तो बाद में जब आप कॉल self.keyword() आप उस वस्तु पर कि विधि कॉल कर रहे हैं, न कि किसी अन्य।

कहें कि आपके पास उस पृष्ठ में उदाहरण छवियां हैं जिन्हें आप हर 2 सेकंड घुमाने के लिए चाहते हैं ... आप चाहते हैं कि उनमें से प्रत्येक 3 टाइमर को अपने विधियों का संदर्भ लें। यदि वे सीधे this का उपयोग करते हैं, तो यह (अधिकांश समय) window का संदर्भ देगा, न कि वर्तमान ऑब्जेक्ट, जबकि वर्तमान संदर्भ को बनाए रखने में एक और चर गुजर रहा है।

+0

देखें लेकिन एक सेटटाइमआउट जैसी विधि वैश्विक है और किसी ऑब्जेक्ट की बजाय JVM द्वारा प्रदान की जाती है? – Konrad

+1

@ कोनराड - 'सेटटाइमआउट() 'एक वैश्विक कार्य है, लेकिन यह किसी भी फ़ंक्शन को निष्पादित कर सकता है, उदाहरण के लिए:' सेटटाइमआउट (मेरा फ़ंक्शन, 1000); 'या' सेटटाइमआउट (फ़ंक्शन() {अलर्ट (यह);}, 1000); ' –

12

यह ब्राउज़र में दो की वजह से setTimeout शर्तों के साथ काम करता है:

  • सभी वैश्विक चर window वस्तु की संपत्ति हैं। इसका मतलब है कि window में एक संपत्ति setTimeout (window.setTimeout) है।
  • window ऑब्जेक्ट में self नामक एक संपत्ति है जो स्वयं को इंगित करती है।

आप स्पष्ट रूप से window लेखन (कि क्या वैश्विक वैश्विक चर बनाता है) के बिना window के गुणों का उपयोग कर सकते हैं, दोनों कॉल काम: setTimeout() खिड़की वस्तु पर संपत्ति setTimeout() ऊपर दिखेगा। self.setTimeout() पर window ऑब्जेक्ट पर संपत्ति देखेंगे, जो विंडो ऑब्जेक्ट स्वयं ही है।

तो अगर आप self.setTimeout() फोन यह window.self.setTimeout() जो window.setTimeout() जो फिर setTimeout() रूप में ही है के रूप में ही है के समान है।

नोट: यह केवल तभी काम करता है जब वर्तमान self को मौजूदा दायरे में परिभाषित किया गया कोई वैरिएबल self नहीं है।

यह वैश्विक क्षेत्र में परिभाषित प्रतीक (अर्थात् परिवर्तनीय या फ़ंक्शन) के साथ काम करता है।तुम खुद का परीक्षण कर सकते हैं:

alert(window.self); 

और

alert(self); 

दोनों को अलर्ट

[object Window] 
+1

अपना पहला बिंदु पुन: यह वास्तव में एक और तरीका है: 'setTimeout'' विंडो 'ऑब्जेक्ट का एक तरीका है जो वैश्विक होने लगता है क्योंकि वैश्विक वस्तु को' विंडो 'बिंदु। –

+0

@ टिम डाउन: स्पष्टीकरण के लिए धन्यवाद। जब हम वैश्विक और विंडो ऑब्जेक्ट के बारे में होते हैं तो मुझे हमेशा थोड़ा उलझन मिलता है;) –

5

हर संपत्ति और window वस्तु पर विधि के साथ या बिना कहा जा सकता है चाहिए 'विंडो।'।

और

स्वयं खिड़की वस्तु पर केवल पढ़ने के लिए संपत्ति है कि खिड़की में ही रिटर्न है (MDN)

तो

setTimeout()

window.setTimeout()

window.self.setTimeout()

self.setTimeout()

सब एक ही बात कर रहे हैं।

window.setTimeout() या किसी अन्य तरीके से करने के बजाय self.setTimeout() करने का मुख्य लाभ यह है कि, अगर आप कुछ कोड है कि WebWorker अंदर window.setTimeout() कॉल चलाने के लिए, यह असफल हो जायेगी लेकिन self.setTimeout() वेब कार्यकर्ताओं और ब्राउज़र संदर्भ में दोनों काम करेगा। तो अगर आप एक पुस्तकालय है कि दोनों मुख्य विंडो की गुंजाइश और वेब कार्यकर्ता पर काम करना चाहिए लिख रहे हैं, हम self.

self का उपयोग कर हमेशा GlobalScope जो ब्राउज़र मोड के मामले में है window और वेब श्रमिकों के अंदर का उल्लेख है `WorkerGlobalScope को प्राथमिकता देनी चाहिए '

+1

वेबवर्कर में चलते समय अंतर के बारे में उपयोगी बिंदु – elfan

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