javascript - मैं ES2015 में नामित तीर फ़ंक्शन कैसे लिखूं?




4 Answers

मैं ES2015 में नामित तीर फ़ंक्शन कैसे लिखूं?

आप जिस तरह से अपने प्रश्न में इनकार करते हैं, वही करते हैं: आप इसे असाइनमेंट या प्रॉपर्टी स्टार्टिस्टाइज़र के दाईं ओर रखते हैं जहां परिवर्तनीय या संपत्ति का नाम जावास्क्रिप्ट इंजन द्वारा किसी नाम के रूप में उपयोग किया जा सकता है। ऐसा करने का कोई और तरीका नहीं है, लेकिन ऐसा करना सही है और विनिर्देशन से पूरी तरह से कवर किया गया है।

प्रति कल्पना, इस समारोह का एक असली नाम है, sayHello :

var sayHello = name => {
    console.log(name + ' says hello');
};

यह असाइनमेंट ऑपरेटर> रनटाइम SetFunctionName में परिभाषित किया गया है : मूल्यांकन जहां यह सार SetFunctionName ऑपरेशन को कॉल करता है (वह कॉल वर्तमान में चरण 1.e.iii में है)।

इसी तरह, रनटाइम SetFunctionName : प्रॉपर्टीडिफिनिशन SetFunctionName नाम SetFunctionName नाम को कॉल SetFunctionName और इस प्रकार यह फ़ंक्शन एक सच्चा नाम देता है:

let o = {
    sayHello: name => {
        console.log(`${name} says hello`);
    }
};

आधुनिक इंजनों ने पहले से ही बयान के लिए फ़ंक्शन का आंतरिक नाम सेट किया है; एज अभी भी रनटाइम ध्वज के पीछे फ़ंक्शन इंस्टेंस पर name रूप में उपलब्ध करा रहा है।

उदाहरण के लिए, क्रोम या फ़ायरफ़ॉक्स में, वेब कंसोल खोलें और फिर इस स्निपेट को चलाएं:

"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
  foo();
} catch (e) {
  console.log(e.stack);
}

क्रोम 51 और ऊपर और फ़ायरफ़ॉक्स 53 और ऊपर (और एज 13 और ऊपर एक प्रयोगात्मक ध्वज के साथ), जब आप इसे चलाते हैं, तो आप देखेंगे:

foo.name is: foo
Error
    at foo (http://stacksnippets.net/js:14:23)
    at http://stacksnippets.net/js:17:3

ध्यान दें foo.name is: foo और Error...at foo

क्रोम 50 और इससे पहले, फ़ायरफ़ॉक्स 52 और इससे पहले, और प्रयोगात्मक ध्वज के बिना एज, आप इसे इसके बजाय देखेंगे क्योंकि उनके पास Function#name संपत्ति नहीं है (अभी तक):

foo.name is: 
Error
    at foo (http://stacksnippets.net/js:14:23)
    at http://stacksnippets.net/js:17:3

ध्यान दें कि foo.name is: से नाम गुम है 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

मैं नहीं कह रहा हूं कि यह सुंदर है, लेकिन यह काम करता है अगर आप बिल्कुल, एक अभिव्यक्ति रैपर की सकारात्मक आवश्यकता है।

मेरे पास एक ऐसा कार्य है जिसे मैं ES6 में नए तीर वाक्यविन्यास में बदलने की कोशिश कर रहा हूं। यह एक नामित समारोह है:

function sayHello(name) {
    console.log(name + ' says hello');
}

बिना किसी कथन के नाम देने का कोई तरीका है:

var sayHello = (name) => {
    console.log(name + ' says hello');
}

जाहिर है, मैं इसे परिभाषित करने के बाद ही इस फ़ंक्शन का उपयोग कर सकता हूं। कुछ ऐसा करने जैसा है:

sayHello = (name) => {
        console.log(name + ' says hello');
    }

क्या ईएस 6 में ऐसा करने का कोई नया तरीका है?




यदि 'नामित' से, आप का मतलब है कि आप अपने तीर फ़ंक्शन की .name प्रॉपर्टी सेट करना चाहते हैं, तो आप भाग्य में हैं।

यदि एक तीर फ़ंक्शन को असाइनमेंट अभिव्यक्ति के दाईं ओर परिभाषित किया गया है, तो इंजन बाएं हाथ की ओर ले जाएगा और तीर फ़ंक्शन के .name को सेट करने के लिए इसका उपयोग करेगा, उदाहरण के लिए

var sayHello = (name) => {
    console.log(name + ' says hello');
}

sayHello.name //=== 'sayHello'

ऐसा कहकर, आपका प्रश्न और अधिक लगता है 'क्या मुझे उछालने के लिए एक तीर कार्य मिल सकता है?'। उस का जवाब एक बड़ा ओल 'नहीं' है, मुझे डर है।




आप कार्य बनाने के लिए फ़ंक्शन भाग और तीर भाग को छोड़ सकते हैं। उदाहरण:

 class YourClassNameHere{

   constructor(age) {
     this.age = age;
   }

   foo() {
     return "This is a function with name Foo";
   }

   bar() {
     return "This is a function with name bar";
   }

 }

let myVar = new YourClassNameHere(50);
myVar.foo();



यह ES6 है

हाँ मुझे लगता है कि आप इसके बाद क्या कर रहे हैं:

const foo = (depth) => {console.log("hi i'm Adele")}
foo -> // the function itself
foo() -> // "hi i'm Adele"



Related