के रूप में रस कैम ने कहा, आप ग्लोबल नेम स्पेस है, जो कई स्थानों (TinyMCE, आदि से स्क्रिप्ट के संयोजन के इन दिनों में बहुत महत्वपूर्ण है प्रदूषण से बचने)।
जैसा कि एलेक्स सेक्स्टन ने कहा, यह भी अच्छे कोड संगठन के लिए बनाता है।
यदि आप इस तकनीक का उपयोग कर रहे हैं, तो मैं मॉड्यूल पैटर्न का उपयोग करने का सुझाव दूंगा। यह अभी भी वस्तु शाब्दिक का उपयोग करता है, लेकिन एक scoping समारोह से लौटने के मूल्य के रूप में:
var MyThingy = (function() {
function doSomethingCool() {
...
}
function internalSomething() {
....
}
function anotherNiftyThing() {
// Note that within the scoping function, functions can
// call each other direct.
doSomethingCool();
internalSomething();
}
return {
doSomethingCool: doSomethingCool,
anotherNiftyThing: anotherNiftyThing
};
})();
बाहरी उपयोग:
MyThingy.doSomethingCool();
scoping समारोह अपने कार्यों के सभी के चारों ओर लिपटा है, और फिर आप इसे तुरंत फोन और इसके वापसी मूल्य स्टोर करें। लाभ:
- कार्य सामान्य रूप से घोषित किया गया है और इसलिए नाम है। (जबकि
{name: function() { ... }}
प्रारूप के साथ, आपके सभी फ़ंक्शन अज्ञात हैं, भले ही उनके संदर्भ में गुणों का नाम हो।) नाम आपको मदद करने में मदद करते हैं, एक डिबगर में कॉल स्टैक दिखाने से, आपको यह बताने के लिए कि किस कार्य ने अपवाद फेंक दिया है। (2015 अपडेट: नवीनतम जावास्क्रिप्ट विनिर्देश, ईसीएमएस्क्रिप्ट 6 वां संस्करण, जावास्क्रिप्ट इंजन को infer फ़ंक्शन का नाम होना चाहिए, इसकी एक बड़ी संख्या को परिभाषित करता है। उनमें से एक यह है कि फ़ंक्शन को हमारे {name: function() { ... }}
उदाहरण के रूप में किसी संपत्ति को सौंपा गया है। इंजन ईएस 6 लागू करते हैं, यह कारण दूर जाएगा।)
- आपको केवल अपने मॉड्यूल (जैसे कि मेरे
internalSomething
ऊपर) द्वारा उपयोग किए जाने वाले निजी कार्यों की स्वतंत्रता देता है। पृष्ठ पर कोई अन्य कोड उन कार्यों को कॉल कर सकता है; वे वास्तव में निजी हैं। केवल वही जो आप अंत में निर्यात करते हैं, रिटर्न स्टेटमेंट में, स्कोपिंग फ़ंक्शन के बाहर दिखाई दे रहे हैं।
- पर्यावरण के आधार पर विभिन्न कार्यों को वापस करना आसान बनाता है, अगर कार्यान्वयन पूरी तरह से बदलता है (जैसे आईई-बनाम-डब्ल्यू 3 सी सामान, या एसवीजी बनाम कैनवास आदि)।
विभिन्न कार्यों लौटने का उदाहरण:
var MyUtils = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent('on' + eventName, handler);
}
function hookViaListener(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
return {
hook: window.attachEvent ? hookViaAttach : hookViaListener
};
})();
MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
स्रोत
2009-10-21 11:25:40
जब आप "अज्ञात" तरीके से फ़ंक्शन को तुरंत चालू करते हैं, तो आप इसे अभी भी एक नाम दे सकते हैं (var x = function x() {...})। जब आप ऐसा करते हैं, तो नाम इस तरह बाध्य होता है कि यह फ़ंक्शन के भीतर रिकर्सिव संदर्भों के लिए उपलब्ध है। – Pointy
@Pointy: आप ऐसा नहीं कर सकते (एक असाइनमेंट के भीतर फ़ंक्शन नाम का उपयोग करें) क्रॉस-ब्राउज़र, यह आईई या सफारी पर सही ढंग से काम नहीं करता है; विवरण: http://yura.thinkweb2.com/named-function-expressions/ और आपको फ़ंक्शन का उचित नाम ('foo' 'फ़ंक्शन foo' में) की आवश्यकता नहीं है, पूरे दायरे में इन-स्कोप है यह घोषित किया गया है, जिसमें फ़ंक्शन के भीतर भी शामिल है, इसलिए 'foo' प्रतीक' foo' के माध्यम से स्वयं को कॉल कर सकता है, किसी भी चीज़ (उस बिंदु पर) के संदर्भ संदर्भ को निर्दिष्ट करने की आवश्यकता नहीं है। –
(जारी रखने) यह माना जाता है कि यह * अच्छा * एक ही समय में असाइनमेंट और उचित नाम दोनों का उपयोग करने में सक्षम होगा क्योंकि यह स्कोपिंग फ़ंक्शन से कार्यों को निर्यात करना आसान बनाता है। कल्पना निश्चित रूप से इसे अनुमति देता है, लेकिन दुख की बात है, व्यावहारिकता (कार्यान्वयन कीड़े) इसमें प्रवेश करती है। –