2013-02-15 15 views
9

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

function a() { 
    function b() { 
     function c() { 
      window.alert(3); 
     } 
     window.alert(2); 
    } 
    window.alert(1); 
} 

या आपको ऐसा कुछ करना होगा?

function a() { 
    var a = function() { 
     var c = function() { 
      window.alert(3); 
     } 
     window.alert(2); 
    } 
    window.alert(1); 
} 

ECMA-262 का कहना है कि:

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

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

+2

मुझे यकीन नहीं है कि मानक क्या है, थोड़ा उलझन में लग रहा है, लेकिन ईमानदारी से मुझे आईई 8 + और अन्य सभी ब्राउज़रों में फ़ंक्शन घोषणाओं को घोंसले में कभी समस्या नहीं हुई है। – elclanrs

उत्तर

5

फंक्शन डिक्लेरेशन की फ़ंक्शन बॉडी में निश्चित रूप से अनुमति है, और मुझे कोई भी बग नहीं है।

यह एक बार आप ES5 production rules

FunctionBody 
    SourceElements (opt) 

SourceElements 
    SourceElement 
    SourceElements SourceElement 

SourceElement 
    Statement 
    FunctionDeclaration 

दूसरे शब्दों में देखो सब बहुत स्पष्ट है, समारोह शरीर स्रोत तत्व शामिल हैं, और स्रोत तत्व या तो एक वक्तव्य या एक FunctionDeclaration है। इसलिए फंक्शन डिसक्लेरेशन फ़ंक्शन बॉडी का हिस्सा हो सकता है।

जिस खंड के बारे में आपने उल्लेख किया है ... "ईसीएमएस्क्रिप्ट के कार्यान्वयन ... जिसे स्टेटमेंट के रूप में फंक्शनक्लेक्शनेशन के उपयोग के समर्थन के लिए जाना जाता है" का मतलब है फंक्शन डिसक्लेरेशन को स्टेटमेंट के रूप में उपयोग करना, लेकिन सीधे फ़ंक्शन बॉडी में नहीं। यह मामलों का जिक्र कर रहा है जैसे:

if (...) { 
    function f() {} 
} 

यह एक गैर-मानकीकृत व्यवहार है। इन function statements पर और देखें।

+0

वाह - कंगैक्स - ठंडा। क्या मुझे भाषा spec के इस हिस्से की तरह वास्तव में ब्लॉक-स्तरीय फ़ंक्शन घोषणाओं के बारे में ES.next पृष्ठ पर कुछ सही ढंग से देखना याद है? –

+0

हाँ, मुझे लगता है कि वे इसे मानकीकृत करने की कोशिश कर रहे हैं। आईआईआरसी सख्त मोड के तहत नवीनतम इंजनों में कुछ बदलाव भी हुए हैं। – kangax

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