2015-05-31 9 views
5

मेरी समस्या यहां झूठ बोलती है मैं जावास्क्रिप्ट सीख रहा हूं लेकिन प्रोग्रामिंग के लिए बिल्कुल नया नहीं है। मैं hoisting समझता हूं, लेकिन सख्त मोड के साथ यह एक त्रुटि उत्पन्न नहीं करनी चाहिए और 6 या तो एक चर या दस्तावेज undeclared करने के लिए आवंटित किया जाता है .getElement ... असाइन किया गया है x यह एक त्रुटि उत्पन्न नहीं करता है तो मेरा निदान यह है कि hoisting अभी भी चल रहा है .. जो मुझे पसंद नहीं है और सख्त उपयोग से छुटकारा पाने के लिए चाहते हैं। अपने ब्राउज़र के रूप में क्रोम संस्करण 42.0.2311.152 मीटर का उपयोग करना'सख्त उपयोग करें' फ़ंक्शन स्कोप में होस्टिंग को रोकना नहीं

function strictMode(){ 
    'use strict'; 
    try { 
     x = 6; 
     document.getElementById('hoisting').innerHTML = x; 
     var x; 
    } 
    catch(err) { 
        document.getElementById('error_report').innerHTML = 
         "There was an error that occured (Were in Strict Mode)" + 
          " " + err.message; 
       } 
} 
+1

मुझे नहीं लगता कि सख्त मोड – GillesC

+0

मैंने पढ़ा है कि यह किया है, यही वजह है कि यह मेरे सवाल पैदा की उत्थापन को दूर करने का इरादा ... मैंने पढ़ा है कि विभिन्न वेबसाइटों से –

उत्तर

9

चर घोषणाओं (अर्थात var x;) पूरे दायरे वे में लिखे गए हैं के लिए मान्य हैं, भले ही आप आपके द्वारा सौंपे जाने के बाद घोषणा करते हैं। "hoisting" का अर्थ यह है: var x; दायरे की शुरुआत में फहराया गया है, और असाइनमेंट x = 6; ठीक है क्योंकि x को उस दायरे में कहीं घोषित किया गया है।

Strict mode इनमें से कोई भी नहीं बदलता है। यह एक त्रुटि फेंक देगा यदि आपने var x; घोषणा पूरी तरह से छोड़ी है; सख्त मोड के बिना, परिवर्तनीय का दायरा निश्चित रूप से वैश्विक दायरा होगा।

ES2015 (a.k.a. ES6) में, के बजाय let कीवर्ड का उपयोग करके hoisting से बचा जाता है। (दूसरा अंतर यह है कि let के साथ घोषित वैरिएबल पूरे फंक्शन पर स्थानीय नहीं हैं।)

+0

निहित वैश्विक गुंजाइश पर अच्छा टिप्पणी, पारंपरिक रूप से कुछ भी एक में घोषित फ़ंक्शन स्कोप केवल फ़ंक्शन की अवधि के लिए उपलब्ध था और 'जीवित' था। क्या आप कह रहे हैं कि परंपरागत तरीकों से स्कोपिंग वापस करने का एकमात्र तरीका सख्त तरीका है? –

+0

जब तक आप अपनी 'var' घोषणाओं को परिश्रमपूर्वक लिखते हैं, तब तक सख्त मोड में कोई फर्क नहीं पड़ता। वैरिएबल अभी भी उस ब्लॉक के लिए स्कॉप्ड हैं जो उन्हें घोषित किया गया है, यहां तक ​​कि सख्त मोड के बिना भी। सख्त मोड केवल आपको पकड़ने के लिए है यदि आप एक चर घोषित करने के लिए _forget_। – Thomas

+0

यह भी ध्यान रखें कि "जीवित" "दायरे में होने" से एक पूरी तरह से अलग अवधारणा है। उदाहरण के लिए, यदि मैं 'फ़ंक्शन foo() {var x = {} लिखता हूं; वापसी एक्स; } 'फिर 'x' केवल' foo' के भीतर गुंजाइश में होगा, लेकिन इसके मूल्य के साथ कॉलर क्या करता है, इसके आधार पर इसका मान" लाइव "हो सकता है। – Thomas

0

कुछ अजीब चीजें हैं जावास्क्रिप्ट अनुमति देता है, जैसे कोई भाषा सीख रहा है, आपको अच्छे कोडिंग के साथ लड़ना सीखना होगा प्रथाओं (simicolons एक और अच्छा उदाहरण हैं)। उछाल के मामले में, आमतौर पर दायरे के शीर्ष पर अपने चर घोषित करने के लिए यह अच्छा अभ्यास है जहां उन्हें वैसे भी फहराया जाएगा। जैसा कि पहले ही उल्लेख किया गया है, सख्त मोड एक चांदी की बुलेट नहीं है और यह आपके लिए लागू नहीं करेगा।

+0

धन्यवाद, मैं वास्तव में एक औपचारिक प्रोग्रामर से अधिक हूं और पुराने तरीकों को पसंद करता हूं। मैंने पढ़ा है कि सख्त मेरे परीक्षण के कारण उछाल बंद कर देगा .. यह सिर्फ मुझे परेशान करता है कि उछाल ने दूसरों की तरह नहीं कहा है। –

+0

मुझे लगता है कि भ्रम शायद इस तथ्य से आता है कि, जैसा कि @ थॉमस बताता है, सख्त मोड के लिए आपको चर घोषित करने की आवश्यकता होती है – aw04

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