2010-05-28 15 views
25

संभव डुप्लिकेट:
JavaScript: var functionName = function() {} vs function functionName() {}जावास्क्रिप्ट में var name = function() {} और फ़ंक्शन नाम() {} के बीच कोई अंतर है?

मान लीजिए हम एक समारोह के अंदर और वैश्विक नामस्थान में नहीं हैं।

function someGlobalFunction() { 
    var utilFunction1 = function() { 
    } 

    function utilFunction2() { 
    } 

    utilFunction1(); 
    utilFunction2(); 

} 

क्या ये समानार्थी हैं? और someGlobalFunction रिटर्न करते समय इन कार्यों को पूरी तरह से समाप्त करना बंद कर देता है? क्या मुझे पठनीयता या किसी अन्य कारण के लिए एक या दूसरे को पसंद करना चाहिए?

उत्तर

46

वे अधिकतर समान हैं।

utilFunction1 केवल घोषित होने के बाद ही उपलब्ध होगा। utilFunction2 फ़ंक्शन के शीर्ष पर फिसल गया है, इसलिए इसे परिभाषित करने से पहले उपयोग किया जा सकता है।

function someGlobalFunction() { 
    utilFunction1(); // Error: untilFunction1 is undefined :(
    utilFunction2(); // Works 

    var utilFunction1 = function() { 
    } 

    function utilFunction2() { 
    } 
} 

जब तक वे एक बंद में फंस रहे हैं, दोनों जब अस्तित्व में someGlobalFunction रिटर्न बंद हो जाएगा।

मैं utilFunction2 घोषित करने के लिए उपयोग की जाने वाली विधि का उपयोग करना पसंद करता हूं, लेकिन यह आपके ऊपर है। प्रपत्र utilFunction2 की

घोषणाएं (जो समारोह घोषणा कहा जाता है) का नाम दिया जा रहा है में (यानी utilFunction2 के रूप में दिखने) अपने पसंदीदा-डिबगरटीएम, जहां के रूप में utilFunction1 (बुलाया समारोह भाव) हैं का लाभ बस अज्ञात फ़ंक्शन के रूप में दिखाएं।


पूर्णता के लिए, आपके पास फॉर्म भी है;

var utilFunction3 = function utilFunction4() { 
    // blah 
}; 

... जो एक नामित समारोह अभिव्यक्ति है, जो weird properties है कहा जाता है के लिए अपने स्वयं के (और bugs (आईई के पुराने संस्करणों) में)।

+0

+1 - ऐसा लगता है कि आपके पास सब कुछ शामिल है। – ChaosPandion

+3

यह भी ध्यान दिया जा सकता है कि पहला एक फंक्शनएक्सप्रेस है जबकि बाद वाला एक फंक्शन डिसक्लेरेशन है। –

9

हाँ, वे काफी अलग हैं:

  • utilFunction1 कोई नाम नहीं है, इसलिए यदि यह एक अपवाद फेंकता है, अपना डीबगिंग टूल केवल आपको बता देंगे एक गुमनाम समारोह ऊपर फेंक दिया कि
  • utilFunction2 में उपलब्ध हो जाएगा उस लाइन से पहले भी फ़ंक्शन का दायरा पहुंच गया है (जैसे फ्लेचर नोट किया गया है)
  • उपयोग का उपयोग कर फ़ंक्शन 2 नोटेशन आईई में कुछ परिस्थितियों में अजीब व्यवहार कर सकता है।

पूर्व:

if (true) { 
    function utilFunction() { 
    return true; 
    } 
} else { 
    function utilFunction() { 
    return false; 
    } 
} 

utilFunction(); // returns false in IE, true everywhere else 

आईई, चरम, प्रभावी ढंग से मूल्यांकन कर कार्यों के लिए समारोह गुंजाइश मुद्दा लेता है, भले ही उनके लिए कोई कोड पथ है!

+7

'if' या अन्य गैर-फ़ंक्शन-ब्लॉक के अंदर फ़ंक्शन स्टेटमेंट रखना ECMAScript में मान्य नहीं है; ब्राउज़र व्यवहार जंगली रूप से भिन्न होता है। से बचें! – bobince

8

बधाई हो!आपको वह स्थिति मिली है जहां फंक्शन होस्टिंग शामिल हो जाता है।

var foo = function() { }; 

से

function foo() { }; 

सब कहीं उल्लेख किया कारणों के लिए, के अलावा एक काफी अलग है।

दूसरा उदाहरण "hoisted" होगा - यह वर्तमान बंद होने (आमतौर पर वर्तमान फ़ंक्शन) के भीतर कहीं भी उपलब्ध होगा। कहा गया बंद होने के पहले भी घोषित किया गया है।

इस तरह काम करेगा:

function foo() { 
    bar(); 
    function bar() { alert('baz'); } 
} 

कुछ जबकि इस तरह सबसे अधिक निश्चित रूप से नहीं:

function foo() { 
    bar(); 
    var bar = function bar() { alert('baz'); }; 
} 

आप इस दूसरे उदाहरण में कोई त्रुटि मिलती है, क्योंकि बार निर्धारित नहीं किया गया अभी तक। यदि आप फंक्शन foo फ़ंक्शन में दो पंक्तियों को स्वैप करते हैं, तो वह उदाहरण काम करेगा।

डगलस क्रॉकफोर्ड इस दूसरी विधि का उपयोग करने की वकालत करता है, क्योंकि इसमें होस्टिंग जैसे छिपे हुए व्यवहार नहीं होते हैं - आपका कोड वही करता है जो यह कहता है कि यह करेगा, कोई चाल शामिल नहीं है।

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