window.location बनाम सिर्फ स्थान


79

वेब भर में, मैं जावास्क्रिप्ट प्रोग्रामर की एक विशाल संख्या लिख देख window.locationबस के बजाय location। मैं उत्सुक था कि कोई भी क्यों के रूप में स्पष्टीकरण दे सकता है। windowवैश्विक वस्तु है, और इसलिए इसे शामिल करना अनावश्यक है - है ना? मेरा मतलब है, आप लोगों को लिखते हुए नहीं देखते window.Math.floorया new window.Date(), इसलिए मैं उत्सुक हूं कि यह क्यों निर्दिष्ट किया जाएगा location

मैं समझता हूं कि locationआप जिस विंडो में हैं, उसका "प्रॉपर्टी" माना जाता है, जो मुझे लगता है कि कुछ मायने रखता है। लेकिन फिर भी, मुझे वैश्विक वस्तु को निर्दिष्ट करने का कोई कारण नहीं दिखता है; locationपृष्ठ को पुनर्निर्देशित किए बिना नहीं, पहली जगह में ओवरराइट करना संभव नहीं है ।

तो, क्या यह सिर्फ एक विचित्रता है जो इतने लंबे समय के लिए इस्तेमाल किया गया है कि यह कैसे हम जावास्क्रिप्ट लिखते हैं, या इस तरह से चीजों को करने के लिए कुछ ठोस कारण है के साथ एकीकृत हो गया है? मैंने Google की जाँच की, लेकिन अफसोस, मैं कुछ नहीं के साथ आया ...

जवाबों:


85

मैं हमेशा window.locationदो प्रमुख कारणों से अपने कोड में उपयोग करता हूं:

  1. जब भी संभव हो वैश्विक चर से बचना एक अच्छी आदत है। window.उपसर्ग का उपयोग मुझे याद दिलाता है कि चर वैश्विक है और अन्य नहीं हैं।
  2. जावास्क्रिप्ट की स्कोपिंग की प्रकृति आपको स्कोप के पेड़ को ऊंचे स्तर पर स्थापित करने की अनुमति देती है। इसका मतलब है कि आप var locationकहीं न कहीं एक दायरे में सेट हो सकते हैं (यह एक चर नाम के रूप में उपयोग करने के लिए एक अप्रत्याशित शब्द नहीं है) और आप इसके बजाय उस पर काम करेंगे।

मेरे लिए, कोडिंग करते समय उद्देश्य की स्पष्टता बहुत महत्वपूर्ण है क्योंकि इससे मुझे बग्स को लिखने से बचने में मदद मिलती है और फिर मुझे ऐसा करने में मदद मिलती है।


मैं यह भी कल्पना करता हूं कि जेएस को यह बताने के लिए कि वैश्विक सीमा तक गुंजाइश श्रृंखला पर लूप बनाने के बजाय चर को कहां खोजना है, एक तेज दृष्टिकोण हो सकता है।
रायजैक्स

3
@ रयाजैक्स नं, वास्तव में, क्योंकि जेएस को यह निर्धारित करने के लिए कि window इसे गुंजाइश श्रृंखला के माध्यम से लूप करना है।
लोन्सोमेडेय

16

आंशिक रूप से सुरक्षा के लिए अगर कोई locationस्कोप श्रृंखला में कहीं चर को परिभाषित करता है । की window.locationसंपत्ति के लिए यह एक स्पष्ट संदर्भ बनाता है window

उदाहरण: http://jsfiddle.net/dr6KH/

(function() {
    var location = 'new value'; // creating a local variable called "location"

    (function() {
        alert(location);  // alerts "new value"

        alert(window.location);  // alerts the toString value of window.location
    })();

})();

11

window.locationदेशी Mathऔर Dateवस्तुओं के बीच एक बड़ा अंतर है , जो यह है Mathऔर Dateदेशी जावास्क्रिप्ट ऑब्जेक्ट हैं जो वैश्विक ऑब्जेक्ट के गुणों के रूप में मौजूद हैं, जबकि होस्ट ऑब्जेक्टwindow.location की एक संपत्ति है (एक होस्ट ऑब्जेक्ट एक वस्तु है जो किसी पहलू का प्रतिनिधित्व करती है पर्यावरण, पर्यावरण द्वारा प्रदान किया गया है, और देशी जावास्क्रिप्ट वस्तुओं के समान नियमों के अधीन नहीं है। अन्य मेजबान वस्तुओं में कोई भी DOM तत्व शामिल है)।window document

windowब्राउज़रों में दो उद्देश्य हैं: पहला, (अच्छी तरह से निर्दिष्ट) ECMAScript वैश्विक ऑब्जेक्ट के रूप में कार्य करना, और दूसरा, ब्राउज़र वातावरण के बारे में जानकारी प्रदान करने वाले होस्ट ऑब्जेक्ट के रूप में कार्य करना। windowअपनी मेजबान वस्तु क्षमता के उपयोग के लिए , मैं स्पष्ट होना पसंद करता हूं और window.उपसर्ग प्रदान करता हूं : तथ्य यह है कि locationइसके बिना काम करना सिर्फ एक संयोग है जो windowसिज़ोफ्रेनिक प्रकृति से आता है। इसके अलावा, जैसा कि अन्य उत्तरों द्वारा बताया गया है, इस मामले में आपकी सुरक्षा का लाभ भी है जब locationवर्तमान संदर्भ में एक और चर मौजूद है।

उपसर्ग न करने Dateया इसके Mathसाथ एक अच्छा कारण यह window.है कि ऐसा करने से एक ऐसा कोड बनता है जो गैर-ब्राउज़र वातावरण में काम नहीं करता है। अन्य वातावरण आमतौर पर windowवैश्विक वस्तु के लिए एक उपनाम के रूप में प्रदान नहीं करते हैं ।


6

कोडिंग का हिस्सा स्पष्टता है। गणित या तिथि के विपरीत, स्थान वैचारिक रूप से खिड़की का एक गुण है, इसलिए इसे शामिल करने के लिए कोड अधिक स्पष्ट हो जाता है। खिड़की।" प्रीफ़िक्स के लिए उपसर्ग को आदर्श रूप से हटाया जाना चाहिए।

आप शायद सही हैं कि इसका बहुत बड़ा कारण ऐतिहासिक है। जावास्क्रिप्ट का प्रतिलिपि और चिपकाने का एक व्यापक इतिहास है।


यही मैंने सोचा है, लेकिन बहुत सारे लोग हैं जो इसे करते हैं; मेरे द्वारा उपयोग किए जाने वाले प्रत्येक स्रोत का बहुत अधिक उपयोग window.location। केवल "बनाम" पृष्ठ मुझे चर्चा window.locationबनाम मिल सकते थे location.href, जो या तो मदद नहीं करते थे।
रीड

5

यह हमेशा केवल शैली का मामला नहीं है - मैं स्क्रिप्ट के तत्वों को एक टुकड़े में जोड़कर खिड़की के लोड घटना के बाद असमान रूप से सोशल मीडिया बटन लोड करने की कोशिश कर रहा था, और फिर उस टुकड़े को दस्तावेज़ में जोड़ दिया। ट्विटर के widgets.js location.hrefकई स्थानों पर उपयोग करता है और IE 8/9 में निम्नलिखित त्रुटि का कारण था: विधि या संपत्ति का उपयोग करने के लिए अप्रत्याशित कॉल । मुझे पता नहीं क्यों, लेकिन यह केवल तब होता है जब पृष्ठ पर किसी अन्य पृष्ठ के लिंक के माध्यम से जाकर। यदि आप केवल स्क्रिप्ट तत्व को सिर या उपयोग के लिए जोड़ते window.location.hrefहैं, तो यह नहीं होता है, इसलिए यह IE 8/9 और के साथ कुछ अजीब प्रतीत होता है createDocumentFragment()

उदाहरण:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
    var head = document.getElementsByTagName('head')[0];
    var frag = d.createDocumentFragment();
    var s = d.createElement(t);
    s.async = true;
    s.src = 'http://platform.twitter.com/widgets.js';
    frag.appendChild(s);
    head.appendChild(frag);
} (document, 'script'));
</script>

3

windowवस्तु डिफ़ॉल्ट काम कर नाम स्थान है, इसलिए locationके बराबर हो जाएगा window.location

मुझे लगता है कि उपयोग locationकरना थोड़ा अस्पष्ट है, window.locationस्पष्टता के लिए उपयोग करें ।


1
मैंने इस जवाब के लिए वोट दिया (और लगभग दूसरों में से कोई नहीं) क्योंकि, इस मूर्खतापूर्ण उदाहरण की कल्पना करते हैं: function f() { var location = "home"; /* later on */ location = "http://google.com" } रोना

@ user166390 उस तर्क से आपको window.documentहर बार लिखना चाहिए । मुझे संदेह है कि किसी के ऐसा करने पर।
सुपरलुक

2

यह सिर्फ स्टाइल की बात है।

वैचारिक रूप से, (इसके विपरीत खिड़की एक स्थान पर है) locationकी एक संपत्ति है window, Mathया इसके विपरीत Date


1

स्थान विंडो ऑब्जेक्ट की एक संपत्ति है, इसलिए आप इसे window.location का अनुरोध करके प्राप्त कर सकते हैं। लेकिन अगर आप एक ऑब्जेक्ट निर्दिष्ट नहीं करते हैं, तो जावास्क्रिप्ट मानता है कि आप विंडो ऑब्जेक्ट चाहते हैं। तो बस अनुरोध करने का स्थान window.location का अनुरोध करने के समान है।


0

वे वास्तव में समान हैं। तकनीकी रूप से, " window" वस्तु वही है जो जावास्क्रिप्ट चर के लिए मूल क्षेत्र के रूप में है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.