6

मैं बस जब एक ब्लॉक दायरे में एक समारोह को परिभाषित करने के लिए एक समस्या हुई थी। निम्नलिखित कार्यक्रम पर विचार करें:समारोह घोषणा या समारोह अभिव्यक्ति

try { 
    greet(); 

    function greet() { 
     alert("Merry Christmas!"); 
    } 
} catch (error) { 
    alert(error); 
} 

मैं इस कार्यक्रम की उम्मीद Merry Christmas! सचेत करने के लिए। हालांकि में फ़ायरफ़ॉक्स है मुझे देता है निम्नलिखित ReferenceError:

ReferenceError: greet is not defined 

ओपेरा और क्रोम पर यह ग्रीटिंग अलर्ट के रूप में मैं इसे करने की उम्मीद।

स्पष्ट रूप से फ़ायरफ़ॉक्स ब्लॉक स्कोप के अंदर फ़ंक्शन को FunctionExpression के रूप में मानता है जबकि ओपेरा और क्रोम इसे FunctionDeclaration के रूप में मानते हैं।

मेरा प्रश्न क्यों फ़ायरफ़ॉक्स अलग तरीके से व्यवहार करता है? कौन सा कार्यान्वयन अधिक तार्किक है? मानक मानकों का कौन सा है?

मैं समझता हूँ कि जावास्क्रिप्ट में घोषणाओं फहराया जाता है और यदि ऐसा है तो एक ही समारोह में एक ही दायरे में दो या अधिक विभिन्न ब्लॉकों में घोषित किया जाता है तो एक नाम संघर्ष हो जाएगा।

हालांकि यह हो आप इस तरह कुछ करना नहीं होता और अधिक समारोह हर बार यह घोषणा की है redeclare करने के लिए तार्किक ताकि कर सकते हैं:

greet(); // Merry Christmas! 

function greet() { 
    alert("Merry Christmas!"); 
} 

greet(); // Happy New Year! 

function greet() { 
    alert("Happy New Year!"); 
} 

मैं ब्लॉक हल करने के लिए लगता है कि यह बहुत उपयोगी हो सकता है, इसके अलावा में ऊपर वर्णित समस्या स्कॉइंग समस्या।

+0

"समारोह redeclare हर बार इतना है कि आप इस तरह से कुछ कर सकते हैं यह घोषित है" - वे * हैं * फिर से संदर्भित, केवल घोषणा एक बार होता है और यह फहराया है। क्या आपने पिछले पैराग्राफ में पुष्टि नहीं की है, कि आप उछाल को समझते हैं? – katspaugh

+2

हाँ मैं जावास्क्रिप्ट में hoisting समझ में आता है। नहीं, मेरी सजा पूरी तरह स्पष्ट है। मैं क्या कहने की कोशिश कर रहा हूँ कि हर बार दुभाषिया एक 'FunctionDeclaration' सामना करना पड़ता है (_every समय यह declared_) यह केवल यह एक ही दायरे में समारोह के पिछले घोषणा तक फहराने चाहिए (function_ _redeclare) है। चूंकि यह सुविधा जावास्क्रिप्ट में मौजूद नहीं है, इसलिए आप वर्तमान जावास्क्रिप्ट मानकों का हवाला देते हुए इसे अमान्य नहीं कर सकते हैं। यह बस एक सुझाव है। जावास्क्रिप्ट में एक ही फ़ंक्शन की कई घोषणाओं को लागू करने के लिए एक सुझाव। उम्मीद है कि आपको कुछ स्पष्टता लाती है। मेरी क्रिसमस @ katspaugh –

+0

ओह, मैं देखता हूँ। धन्यवाद भगवान यह ईएस बोर्ड पर किसी के लिए नहीं हुआ था। मेरी क्रिसमस, आदित! :) – katspaugh

उत्तर

5

दरअसल, ब्लॉक स्कॉप्स के अंदर फ़ंक्शन घोषणाएं स्पष्ट रूप से मानकीकृत नहीं हैं और व्यवहार कार्यान्वयन पर निर्भर है। विभिन्न कार्यान्वयन अलग-अलग प्रतिक्रिया देते हैं। यदि आप किसी कथन के अंदर कोई फ़ंक्शन घोषित करने का प्रयास करते हैं तो आपको वही अजीबता मिल जाएगी।

ES5 कल्पना सिफारिश की है कि इसको लागू करने समारोह घोषणाओं बनाने के अंदर ब्लॉक एक चेतावनी या त्रुटि के रूप में चिह्नित किया।

+0

तो आपको ब्लॉक स्कॉप्स के अंदर फ़ंक्शंस घोषित नहीं करना चाहिए। शायद यह एक अच्छा प्रोग्रामिंग अभ्यास है। जावास्क्रिप्ट के बगल में –

+0

एसिंक लैंग है। इसलिए आपको इसे – Omiga

+0

@ Janim007 पर कॉल करने से पहले अपने फ़ंक्शन को परिभाषित करने की आवश्यकता है, इस प्रश्न का पूरा बिंदु यह है कि जावास्क्रिप्ट में * * परिभाषित होने से पहले * आप * फ़ंक्शन को दोबारा कॉल कर सकते हैं। – katspaugh

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