अनाम फ़ंक्शन अभिव्यक्ति के मामले में, फ़ंक्शन अनाम है - शाब्दिक रूप से, इसका कोई नाम नहीं है। जिस वेरिएबल पर आप इसे असाइन कर रहे हैं उसका नाम है, लेकिन फ़ंक्शन नहीं करता है। (अपडेट: यह ES5 के माध्यम से सच था। ES2015 [उर्फ ES6] के रूप में, अक्सर एक अनाम अभिव्यक्ति के साथ बनाए गए एक फ़ंक्शन को एक सही नाम मिलता है [लेकिन एक स्वचालित पहचानकर्ता नहीं]], पढ़ें ...)
नाम उपयोगी हैं। नामों को स्टैक के निशान, कॉल स्टैक्स, ब्रेकप्वाइंट की सूची आदि में देखा जा सकता है। नाम एक अच्छा चीज है।
(आपको IE [IE8 और उससे नीचे] के पुराने संस्करणों में नामित फ़ंक्शन अभिव्यक्तियों से सावधान रहना पड़ता था, क्योंकि उन्होंने गलती से दो पूरी तरह से अलग-अलग फ़ंक्शन ऑब्जेक्ट दो पूरी तरह से अलग-अलग समय पर बनाए थे [मेरे ब्लॉग के लेख में डबल ले ]। IE8 [!!] का समर्थन करें, यह संभवतः अनाम फ़ंक्शन एक्सप्रेशन या फ़ंक्शन घोषणाओं के साथ चिपकना सबसे अच्छा है , लेकिन फ़ंक्शन फ़ंक्शन नाम से बचें।)
नामित फ़ंक्शन अभिव्यक्ति के बारे में एक महत्वपूर्ण बात यह है कि यह फंक्शनलन बॉडी के भीतर फ़ंक्शन के लिए उस नाम के साथ एक इन-स्कोप पहचानकर्ता बनाता है:
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
ES2015 के अनुसार, हालांकि, बहुत सारे "अनाम" फ़ंक्शन एक्सप्रेशन नाम के साथ फ़ंक्शन करते हैं, और यह विभिन्न आधुनिक जावास्क्रिप्ट इंजनों द्वारा पूर्वनिर्धारित किया गया था जो संदर्भ से नामों का उल्लेख करने के बारे में काफी स्मार्ट थे। ES2015 में, आपकी अनाम फ़ंक्शन अभिव्यक्ति का नाम के साथ एक फ़ंक्शन होता है boo
। हालाँकि, ES2015 + शब्दार्थ के साथ भी, स्वचालित पहचानकर्ता नहीं बनाया गया है:
var obj = {
x: function() {
console.log(typeof x); // "undefined"
console.log(obj.x.name); // "x"
},
y: function y() {
console.log(typeof y); // "function"
console.log(obj.y.name); // "y"
}
};
obj.x();
obj.y();
फ़ंक्शन के नाम के लिए असाइनमेंट सेटफ़ंक्शननाम एब्स्ट्रैक्ट ऑपरेशन के साथ किया जाता है जिसका उपयोग कल्पना में विभिन्न कार्यों में किया जाता है।
लघु संस्करण मूल रूप से किसी भी समय एक अनाम फ़ंक्शन एक्सप्रेशन है जो किसी असाइनमेंट या इनिशियलाइज़ेशन जैसी किसी चीज़ के दाईं ओर दिखाई देता है, जैसे:
var boo = function() { /*...*/ };
(या यह हो सकता है let
या के const
बजाय var
) , या
var obj = {
boo: function() { /*...*/ }
};
या
doSomething({
boo: function() { /*...*/ }
});
(वे अंतिम दो वास्तव में एक ही बात हैं) , परिणामी फ़ंक्शन का एक नाम होगा ( boo
उदाहरणों में)।
एक महत्वपूर्ण, और जानबूझकर, अपवाद है: एक मौजूदा वस्तु पर एक संपत्ति को सौंपना:
obj.boo = function() { /*...*/ }; // <== Does not get a name
इसकी वजह यह थी कि जब नया फीचर जोड़ा जाने की प्रक्रिया से गुजर रहा था, तब सूचना लीक की चिंता बढ़ गई थी; एक और सवाल करने के लिए अपने जवाब में विवरण यहाँ ।