2015-10-23 19 views
6

किसी वेबपृष्ठ पर कुछ प्रारंभिक कोड जोड़ने के दौरान, मैंने खुद को window.onload = ... को उम्प्टीथ समय के लिए लिखा, जब एक विचार ने मुझे मारा।हम खिड़की क्यों लिखते हैं।

window. आवश्यक नहीं है, क्योंकि window वर्तमान वस्तु है। तो यह वैकल्पिक है!
लेकिन कोई भी onload = ... लिखता है और मुझे आश्चर्य है कि ऐसा क्यों है।

मेरा मतलब है, window. क्वालीफायर के बिना alert कहें, हमारे पास अन्य चीजें लिखने के बारे में कोई योग्यता नहीं है।

window.onload = function() { 
    alert('Your window has loaded'); 
}; 

वास्तविकता में, alert बस के रूप में ज्यादा window वस्तु onload है के रूप में की एक विधि है, जबकि।
तो, अंतर क्यों? W3C जैसी औपचारिक वेबसाइटें क्यों करें?

+14

यह * स्पष्ट * है, इसलिए कोई भी नहीं सोचता कि आप गलती से वैश्विक चर को असाइन कर रहे हैं। – Bergi

+0

मुझे यह तर्क पसंद है, क्योंकि यह अंतर बताता है। फ़ंक्शन को कॉल करने वाले एक वेरिएबल को कुछ असाइन करना - आप संभवतः इसे कॉल करके एक नया फ़ंक्शन नहीं बना सकते हैं, इसलिए यह स्पष्ट है कि फ़ंक्शन पहले से मौजूद है। –

+0

@ बर्गि क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं? मुझे लगता है कि यह अभी भी सबसे अधिक आकर्षक तर्क है। –

उत्तर

0

हम window. बारे में जब हम इस बारे में स्पष्ट होना चाहता हूँ। - सब कुछ है कि Window interface का हिस्सा है

  • गुण और window वस्तु की विधियां: मूल रूप से दो मामले हैं जब यह इसका इस्तेमाल करने के अच्छा तरीका है कर रहे हैं। .onload श्रोता जो आपने उल्लेख किया है, इसका उदाहरण है, window.scrollY, window.status, window.parent, window.open(), window.focus(), window.removeEventListener() जैसी चीजें हैं।
  • वैश्विक गुणों का निर्माण। किसी भी दायरे से window.myGlobalVar को असाइन करना वैश्विक "चर" बनाने के लिए एक सामान्य जेएस मुहावरे है। माना जाता है कि यह var के साथ स्पष्ट रूप से घोषित करने के लिए अभी भी बेहतर अभ्यास है।

जबकि हम "वैकल्पिक रूप से" window. भाग को यहां छोड़ सकते हैं, यह असामान्य है। असाइनमेंट के माध्यम से विशेष रूप से implicitly global variables का निर्माण तुच्छ है, और आमतौर पर गलती के रूप में देखा जाता है। तो अगर आप उद्देश्य पर यह करते हैं, आप window. का उपयोग करके अपने इरादे की घोषणा।

हालांकि, पहला मामला हमेशा अच्छी तरह से परिभाषित नहीं होता है। हम अक्सर window. भाग को छोड़ देते हैं जब हम जिस संपत्ति का उपयोग करना चाहते हैं वह अनिवार्य रूप से एक स्थैतिक, वैश्विक चर है, और यह आवश्यक रूप से window ऑब्जेक्ट से संबंधित नहीं है, जब इसे औपचारिक रूप से निर्दिष्ट किया जाता है। आप शायद ही कभी window. उपसर्ग के साथ document, atob(), Worker, setTimeout() या fetch() का उपयोग कर किसी को भी देखते हैं, बस के रूप में आप का उपयोग नहीं करते window.JSON.parse या window.Arrayमें निर्मित के लिए वस्तुओं (हालांकि यह वैध होगा)।

navigator, location या alert() जैसे कुछ अन्य गुण यह हमेशा स्पष्ट नहीं है के लिए

, और उन के बिना या नहीं हो सकता है आधा-आधा किया जाता है।

5

मैं निम्नलिखित कारणों देखें:

  1. ऊपर खोज गुंजाइश श्रृंखला प्रदर्शन थोड़ा में सुधार होगा कम करें। यह आईआईएफई में भी देखा जाता है जहां window फ़ंक्शन के पैरामीटर के रूप में भेजा जाता है और इसके अंदर विंडो के स्थानीय संदर्भ का उपयोग किया जाता है।
  2. समारोह/सदस्य window पर परिभाषित विश्व स्तर पर दायरे में ओवरराइड जाता है, तो यह अपेक्षा के अनुरूप काम नहीं करेंगे, इसलिए संदर्भित स्पष्ट रूप से यह सही समारोह/सदस्य का उल्लेख करता है। यह वैश्विक नाम के समान नाम के साथ फ़ंक्शन/सदस्य बनाने के लिए उपयोगी है और अभी भी छायांकित क्षेत्र से वैश्विक सदस्य तक पहुंचने में सक्षम है।
+1

ठीक है, लेकिन अंतर क्यों? क्यों नहीं सभी 'चेतावनी' के बजाय 'window.alert' लिखते हैं, जो प्रदर्शन में भी सुधार करेगा? –

+0

@Mrlister चेक 'फ़ंक्शन ऑनलोड() { // कोड यहां } ऑनलोड = कुछ; ', यहां' ऑनलोड' अपेक्षित के रूप में काम नहीं करेगा। और एंड्रॉइड द्वारा उत्तर में समझाया गया है, 'ऑनलोड' न केवल' विंडो 'तक ही सीमित है, इसे' img', 'iframe' आदि पर लागू किया जा सकता है, इसलिए इसे स्पष्ट रूप से विंडो पर जोड़ा गया है। 'अलर्ट' के मामले में यह _critical_ फ़ंक्शन नहीं है, भले ही इसे ओवरराइट किया जाए, यह कोड को नुकसान नहीं पहुंचाता है (जैसा कि 'ऑनलोड' के विपरीत) है। – Tushar

2

क्योंकि .onloadwindow के लिए विशिष्ट नहीं है। इसका उपयोग भी किया जा सकता है, उदाहरण के लिए, document.onload के रूप में। इसलिए जब आप अपनी स्क्रिप्ट को निष्पादित करना चाहते हैं तो आप इसे परिभाषित करते हैं।

+0

ठीक है, लेकिन अंतर क्यों? क्यों नहीं सभी 'चेतावनी' के बजाय 'window.alert' लिखते हैं, जो भी अनन्य नहीं है? –

-1

विंडो ऑब्जेक्ट डिफ़ॉल्ट रूप से ब्राउज़र द्वारा प्रारंभ किया गया है। यह एक अच्छा स्पष्ट रूप से विंडो ऑब्जेक्ट को परिभाषित करने के लिए अभ्यास करता है जो इसे & पर प्रभाव डालता है, आपका कोड समझ में आता है।

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