दिलचस्प पोस्ट
परीक्षण करने के लिए एक कोर डेटा बनाने के लिए कैसे करें कि किसी संबंध में सभी ऑब्जेक्ट शामिल हैं? Python nltk और wordnet में एक शब्द / synset के सभी hyponyms को कैसे प्राप्त करें? कैसे कस्टम घटनाओं का उत्सर्जन और संभाल करने के लिए? सी + + प्रदर्शन चुनौती: std :: string रूपांतरण के लिए पूर्णांक WCF सेवा में प्रमाणपत्र के बिना संदेश सुरक्षा और उपयोगकर्ता नामक क्रेडेंशियल टाइप का उपयोग कैसे करें? पायथन पर "एट" (@) प्रतीक क्या करता है? सेलफ़ोररौएटआईंडएक्सपाथ पर कोरडाटा से छवि लोड करना स्क्रॉलिंग को धीमा कर देती है एंड्रॉइड एचटीटीपी पोस्ट: परिणाम कैसे प्राप्त करें मैं सी # विंडोज कंसोल ऐप में मौजूदा लाइन को कैसे अपडेट कर सकता हूं? क्यों बढ़ाया जीसीसी 6 अनुकूलक व्यावहारिक सी ++ कोड को तोड़ता है? विजुअल स्टूडियो: मैं एक बेस क्लास से विरासत में मिली सभी वर्गों को कैसे दिखाऊं? प्रोसेसिंग के लिए जावा लाइब्रेरी पथ कैसे सेट करें किटकैट की हत्या: स्थानीय संसाधन लोड करने की अनुमति नहीं है: file: ///android_asset/webkit/android-weberror.png एसडी कार्ड में पाठ फ़ाइल लेखन विफल रहता है PHP में एक पूर्ण संख्या में घातीय रूपांतरित करें

जावास्क्रिप्ट लूप वैरिएबल गुंजाइश

जावास्क्रिप्ट चर की स्कॉपींग के बारे में सिर्फ एक त्वरित सवाल

alert() फ़ंक्शन को क्यों नहीं लौटाता i के मूल्य को undefined लौटाता है?

 $(document).ready(function () { for(var i = 0; i < 10; i += 1){ } alert("What is 'i'? " + i); }); 

मैं जेएस के लिए काफी नया हूँ, और लगभग सभी अन्य भाषाओं में मुझे डब दिया गया है, लूप के दायरे में एक घोषणा में उस लूप के मान शामिल होंगे, लेकिन इस मामले में क्यों नहीं?

यानी What is 'i'? 10' What is 'i'? 10' मुद्रित किया गया है

Solutions Collecting From Web of "जावास्क्रिप्ट लूप वैरिएबल गुंजाइश"

For -loop के " प्रारंभिक पैरामीटर " के लिए MDN देखें:

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

जावास्क्रिप्ट में ब्लॉक स्कोप नहीं है, बस गुंजाइश समारोह। चूंकि i का आरंभीकरण एक फ़ंक्शन के भीतर है, उस वैरिएबल एक ही फ़ंक्शन में कहीं भी पहुंच योग्य है।

एमडीएन से :

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

जावास्क्रिप्ट लोग इसे ठीक करने की कोशिश कर रहे हैं!

EcmaScript6 (उर्फ इक्मास्क्रिप्ट 2015) जावास्क्रिप्ट का नवीनतम संस्करण है जिसे पिछली गर्मियों में पारित किया गया था और ब्राउज़र केवल इसकी विशेषताओं का समर्थन करना शुरू कर रहे हैं

उन विशेषताओं में से एक ब्लॉक-स्कोप स्थानीय चर "अभिव्यक्ति" के साथ है। अभी (अप्रैल 2016) के अनुसार, प्रमुख ब्राउज़रों के वर्तमान संस्करण सफारी को छोड़कर इसका समर्थन करते हैं। कुछ मोबाइल ब्राउज़र इसका समर्थन करते हैं

आप यहां इसके बारे में अधिक पढ़ सकते हैं (विशेष रूप से, "छोरों के लिए चलो स्किड चर" अनुभाग देखें): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

आप वर्तमान ब्राउज़र समर्थन की जांच कर सकते हैं (पंक्ति बाइंडिंग -> चलिए देखें): https://kangax.github.io/compat-table/es6/

अन्य भाषाओं (उदाहरण के लिए: जावा, सी ++, सी) के विपरीत, जावास्क्रिप्ट ब्लॉक स्कोप का समर्थन नहीं करता है। एक बार जब आप एक लूप या किसी फ़ंक्शन में एक वेरिएबल घोषित करते हैं, तो यह आपके दायरे से फ़ंक्शन बॉडी के भीतर है I

 for(i=0; i<arr.length; i++) { var j=0; // ... } 

यहाँ आपके i एक वैश्विक वैरिएबल बन जाता i और j में फ़ंक्शन या स्क्रिप्ट के लिए स्थानीय बन जाते हैं जिसमें लूप होता है।

 for(i=0; i<arr.length; i++) { var j=0; // ... } 

यह कहना सही नहीं है कि उपर्युक्त एक वैश्विक चर i बनाता है i मेरा मानना ​​है कि आपको var घोषित करने के लिए हमेशा var का उपयोग करना चाहिए (जब तक कि आप जानबूझकर 'वैरिएबल' की बजाय एक 'प्रॉपर्टी' चाहते हैं -किसी जे एस कोडिंग परिदृश्यों की 99.99% में अपेक्षाकृत कम संभावना नहीं है …)

जब i एक प्रारंभिक मान निर्दिष्ट कर रहा i तो स्थानीय या यहां तक ​​कि वैश्विक वैरिएबल भी नहीं बना रहा है, यह वैश्विक वस्तु के लिए एक प्रॉपर्टी i बना रहा है (जो कि ज्यादातर वैश्विक वैरिएबल की तरह दिखती है – लेकिन उनके पास कुछ सूक्ष्म अंतर है) ।

बेहतर होगा:

 var i; for(i=0; i<arr.length; i++) { var j=0; // ... } 

अब लूप एक वैश्विक चर i का उपयोग कर रहा है (या फ़ंक्शन स्थानीय वैरिएबल i , यदि यह कोड फ़ंक्शन में दिखाई देता है)

इस बारे में अधिक जानकारी के लिए जो कि वर्ड की ओर से काम करता है और जावास्क्रिप्ट में चर बनाम गुण है

– ध्यान दें, थोड़ा भ्रामक क्या होता है कि आप एक वैरिएबल को पुनः घोषित कर सकते हैं, उदाहरण के लिए दूसरे लूप में

 for(var i=0; i<9; i++){ document.write('i = ' + i + '<br>'); } for(var i=0; i<9; i++){ document.write('i = ' + i + '<br>'); } 

यह वैध लगता है (कोई त्रुटि जब मैं परीक्षण करता हूं)। ऐसा लगता है कि आप JavaScript में चर को फिर से घोषित कर सकते हैं – लेकिन यह संभवतः हर एक अच्छा विचार नहीं है, जब तक कि कोई खास मामला न हो – इस संबंधित प्रश्न का उल्लेख करते हुए देखें [कैसे Google Analytics एक चर के 'सुरक्षित' पुनर्वितरण का उपयोग करता है] ( एक जावास्क्रिप्ट चर का पुनर्लेखन )

जेएस में फिर से घोषित चर के बारे में कुछ चर्चा है (और i भी जैसे लूप वैरिएबल) इस संबंधित SO प्रश्न में: पाश के अंदर या बाहर चर को घोषित करना

चर के एकल घोषणा के लिए जावास्क्रिप्ट पैटर्न का आयोजन किया गया है