जावास्क्रिप्ट लहरा चर क्यों करता है?


94

जावास्क्रिप्ट लहरा चर क्यों करता है?

जब उन्होंने उत्थापन को लागू करने का निर्णय लिया तो डिजाइनरों का औचित्य क्या था? क्या कोई अन्य लोकप्रिय भाषाएं हैं जो ऐसा करती हैं?

कृपया प्रलेखन और / या रिकॉर्ड के लिए प्रासंगिक लिंक प्रदान करें।


7
मुझे इस बिंदु पर संदेह है कि यह ऐतिहासिक है, और मुझे गंभीरता से संदेह है कि यह "कार्यान्वयन में आसानी" के अलावा कुछ और था।
डेव न्यूटन

4
ईमानदारी से, ब्रेंडन ईच से पूछें, वह काफी प्रतिक्रियाशील लग रहा है।
फेलिक्स क्लिंग

22
यह प्रश्न कैसे रचनात्मक नहीं है ?
Francisc


20
यह वास्तव में महत्वपूर्ण प्रश्न है। इसकी इजाजत मिलनी चाहिए थी। यह लौ-चारा नहीं था। उत्थापन यह समझने के मूल तत्वों में से एक है कि जावास्क्रिप्ट कैसे काम करता है, और "क्यों" एक वैध प्रश्न है जिसे भाषा के अधिकांश पाठ्यपुस्तक उपचारों में संबोधित किया जाता है। यह ठीक नहीं है कि इस तरह के लोगों के सवालों पर स्टैक ओवरफ्लो लोगों का लगातार पेट भरता है।
बेवेरियन

जवाबों:


55

जैसा कि Stoyan Stefanov "जावास्क्रिप्ट पैटर्न" पुस्तक में बताते हैं, उत्थापन जावास्क्रिप्ट दुभाषिया कार्यान्वयन का परिणाम है।

जेएस कोड व्याख्या दो पासों में की गई। पहले पास के दौरान, दुभाषिया चर और फ़ंक्शन घोषणाओं को संसाधित करता है।

दूसरा पास वास्तविक कोड निष्पादन कदम है। दुभाषिया प्रक्रियाएं अभिव्यक्तियों और अघोषित चर का कार्य करती हैं।

इस प्रकार, हम इस तरह के व्यवहार का वर्णन करने के लिए "उत्थापन" अवधारणा का उपयोग कर सकते हैं।


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

अब मुझे समझ में आया कि जेएस ने सबसे ज्यादा गलत भाषा क्यों समझी, मैंने इसे किसी भी ट्यूटोरियल में नहीं देखा। और उत्थापन (और अंत: प्रवाह) से भ्रमित हो गए।
स्वप्निल पटवा

17
उह, यह वास्तव में औचित्य नहीं समझाता है। एक एकल-पास दुभाषिया (जो फहराने के लिए नेतृत्व नहीं होता) बहुत सरल होता - तो डिजाइनर दो पास क्यों चुनते?
बर्गी

1
यह स्पष्ट नहीं करता है कि चर, विशेष रूप से क्यों फहराए जाते हैं। कार्य समझ में आते हैं, चर (ज्यादातर मामलों में) नहीं - मेरा मानना ​​है कि यह एक बग है।
जोश एम।

जोश एम। यह इतना व्यापक रूप से निर्दिष्ट है, मुझे नहीं लगता कि यह "बग" है ... (मैं मानता हूं कि यह जवाब वास्तव में तर्क का जवाब नहीं देगा)
जोनास विल्म्स

10

जेएस निर्माता ब्रेंडन ईच ने एक बार कहा था (ट्विटर पर) :

"var hoisting इस प्रकार था [a] फंक्शन उत्थापन का अनायास परिणाम, कोई ब्लॉक स्कोप नहीं, [और] JS को 1995 की भीड़ की नौकरी के रूप में।"

उन्होंने यह भी समझाया कि…

"फंक्शन उत्थापन, टॉप-डाउन प्रोग्राम अपघटन की अनुमति देता है, 'आरईसी' को मुफ्त में, घोषणा से पहले कॉल करें;

ब्रेंडन ईच

क्या कोई अन्य लोकप्रिय भाषाएं हैं जो ऐसा करती हैं?

मैं किसी भी अन्य लोकप्रिय भाषाओं के बारे में नहीं जानता जो एक ही तरीके से चर को फहराती हैं। मुझे लगता है कि एक्शनस्क्रिप्ट - फ्लैश डेवलपमेंट में उपयोग किए जाने वाले ईसीएमएस्क्रिप्ट का एक और कार्यान्वयन - उत्थापन लागू नहीं हुआ। यह उन अन्य भाषाओं से परिचित डेवलपर्स के लिए भ्रम और हताशा का स्रोत रहा है जो जावास्क्रिप्ट सीख रहे हैं।

अद्यतन: टिप्पणियों से, पायथन में समान चर उत्थापन व्यवहार होता है


2
एक +1 देना यह एकमात्र ऐसा उत्तर है जो प्रश्न को सीधे संबोधित करने का प्रयास करता है।
डेमोन

1
इस उत्तर के लिए धन्यवाद। मैं @Damon से पूरी तरह सहमत हूँ!
कोडिंगब्रीयन

1
एक और लोकप्रिय भाषा जिसमें परिवर्तनशील
होई

2

इसका कारण यह है कि जावास्क्रिप्ट इंटरप्रेटर दो चक्रों में कोड की व्याख्या करता है।

  1. कोड पूरा / संकलन:
  2. कोड निष्पादन:

1 चक्र में सभी चर और समारोह घोषणाओं समारोह गुंजाइश उस में निष्पादित हो रहा है के शीर्ष पर ले जाया जाता है। ऐसा बनाने में मदद करता है variableObjectsके लिए execution contextभी यह को फांसी से पहले समारोह का।

दूसरे चरण में, मूल्य असाइनमेंट, कोड स्टेटमेंट और फ़ंक्शन कॉल अपेक्षित तरीके से लाइन द्वारा जगह लेते हैं।

आपने यहाँ पर थोड़ा और विस्तृत पढ़ा है।

यह आप व्यवहार के चारों ओर एक बेहतर तस्वीर दे देंगे let, constऔर classघोषणाओं, भी पूर्वता यह चर और कार्यों के बीच इस प्रकार है।


1
क्या आप यह पसंद कर रहे हैं कि यह एक डिज़ाइन पसंद का परिणाम है? यदि हां, तो आपको अपने उत्तर में यह स्पष्ट रूप से बताना चाहिए। लेकिन ब्रेंडन ईच के जवाब को पढ़ना, यह एक वांछित विशेषता हो सकती है, यह निर्भर करता है कि आप अंतिम वाक्य की व्याख्या कैसे करते हैं। नीचे की रेखा, मुझे अभी भी पता नहीं है कि क्यों यकीन है
बॉम्बिनेश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.