मैं ES2015 में नामांकित तीर फ़ंक्शन कैसे लिखूं?
आप इसे अपने प्रश्न के रूप में खारिज कर देते हैं: आप इसे किसी असाइनमेंट या प्रॉपर्टी इनिशियलाइज़र के दाईं ओर रखते हैं, जहाँ चर या प्रॉपर्टी के नाम का उपयोग जावास्क्रिप्ट इंजन द्वारा एक नाम के रूप में किया जा सकता है। ऐसा करने का कोई अन्य तरीका नहीं है, लेकिन ऐसा करना सही है और पूरी तरह से विनिर्देश द्वारा कवर किया गया है।
कल्पना के अनुसार, इस समारोह का एक सही नाम है sayHello:
var sayHello = name => {
console.log(name + ' says hello');
};
इसे असाइनमेंट ऑपरेटर्स> रनटाइम सेमेंटिक्स: इवैलुएशन में परिभाषित किया गया है, जहां यह एब्सट्रैक्ट SetFunctionNameऑपरेशन कहता है (यह कॉल अभी चरण १.e.iii में है)।
समान रूप से, रनटाइम सेमेंटिक्स: प्रॉपर्टीफाइनेशन इवैल्यूएशन कॉल SetFunctionNameऔर इस प्रकार इस फ़ंक्शन को एक सही नाम देता है:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
आधुनिक इंजन पहले से ही इस तरह के बयानों के लिए फ़ंक्शन का आंतरिक नाम सेट करते हैं; एज अभी भी इसे nameरनटाइम फ्लैग के पीछे फ़ंक्शन इंस्टेंस पर उपलब्ध करा रहा है।
उदाहरण के लिए, Chrome या Firefox में, वेब कंसोल खोलें और फिर इस स्निपेट को चलाएं:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Chrome 51 और ऊपर और फ़ायरफ़ॉक्स 53 और उससे ऊपर (और एज 13 और ऊपर एक प्रयोगात्मक ध्वज के साथ), जब आप उसे चलाते हैं, तो आप देखेंगे:
foo.name है: फू
त्रुटि
फू पर (http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3 पर
नोट foo.name is: fooऔर Error...at foo।
Chrome 50 और उससे पहले, फ़ायरफ़ॉक्स 52 और उससे पहले और ऐज को प्रयोगात्मक झंडे के बिना, आप इसके बजाय देखेंगे क्योंकि उनके पास Function#nameसंपत्ति नहीं है (अभी तक):
foo.name है:
त्रुटि
फू पर (http://stacksnippets.net/js:14:23)
http://stacksnippets.net/js:17:3 पर
ध्यान दें कि नाम से याद आ रही है foo.name is:, लेकिन यह है स्टैक ट्रेस में दिखाया गया है। यह सिर्फ इतना है कि वास्तव में फ़ंक्शन पर name संपत्ति को लागू करना कुछ अन्य ES2015 सुविधाओं की तुलना में कम प्राथमिकता थी; क्रोम और फ़ायरफ़ॉक्स अब यह है; एज में एक ध्वज के पीछे है, संभवतः यह ध्वज के पीछे नहीं होगा।
जाहिर है, मैं इस फ़ंक्शन का उपयोग तब कर सकता हूं जब मैंने इसे परिभाषित किया है
सही बात। तीर फ़ंक्शन के लिए कोई फ़ंक्शन घोषणा सिंटैक्स नहीं है , केवल फ़ंक्शन एक्सप्रेशन सिंटैक्स है, और फ़ंक्शन- एक्सप्रेशन नाम की पुरानी शैली में नाम के बराबर कोई तीर नहीं है var f = function foo() { };। तो इसके बराबर नहीं है:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
आपको इसे दो अभिव्यक्तियों में तोड़ना होगा (मेरा तर्क है कि आपको वैसे भी करना चाहिए ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
बेशक, अगर आपको इसे रखना है जहां एक एकल अभिव्यक्ति की आवश्यकता है, तो आप हमेशा कर सकते हैं ... एक तीर फ़ंक्शन का उपयोग करें:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
मैं यह नहीं कह रहा हूं कि यह सुंदर है, लेकिन यह काम करता है अगर आप बिल्कुल, सकारात्मक रूप से एक एकल अभिव्यक्ति आवरण की आवश्यकता है।