क्या मैं जनरेटर के साथ ES6 के एरो फ़ंक्शन सिंटैक्स का उपयोग कर सकता हूं? (एरो नोटेशन)


243

यानी मैं इसे कैसे व्यक्त करूं:

function *(next) {}

तीरों के साथ। मैंने उन सभी संयोजनों की कोशिश की है जिनके बारे में मैं सोच सकता था, और मुझे इस पर कोई दस्तावेज नहीं मिला।

(वर्तमान में नोड v0.11.14 का उपयोग कर)


5
आप नहीं कर सकते। माफ़ करना। " function*कथन (फ़ंक्शन कीवर्ड जिसके बाद तारांकन) एक जनरेटर फ़ंक्शन को परिभाषित करता है।"

2
ध्यान दें कि esdiscuss.org पर इस विषय पर कुछ लंबी चर्चा हुई ।
वॉइसथो

4
आप क्या करने की उम्मीद param*=>{ }करते हैं?
कोडरपी

4
तुम्हें पता है कि के function(){}रूप में ही नहीं कर रहा है ()=>{}?
कोडरपी

8
" यह वास्तव में है कि ES6 जनरेटर 2 कदम आगे और 1 कदम पीछे हैं? " - नहीं, जनरेटर केवल आगे कदम बढ़ा सकते हैं :-)
बर्गी

जवाबों:


231

क्या मैं जनरेटर के साथ ES6 के एरो फ़ंक्शन सिंटैक्स का उपयोग कर सकता हूं?

आप नहीं कर सकते। माफ़ करना।

एमडीएन के अनुसार

function*बयान ( functionकीवर्ड एक तारक के बाद) एक जनरेटर समारोह को परिभाषित करता है।

एक कल्पना दस्तावेज (मेरा जोर) से:

समारोह वाक्य रचना एक वैकल्पिक जोड़ने के लिए बढ़ा दिया गया है *टोकन:

FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" 
  "{" FunctionBody "}"

175
मुझे एक डिजाइन दोष की तरह लगता है।
जोनाथन

23
@ जोनाथन: नहीं। तीर के कार्य हल्के वजन वाले होने चाहिए (और .prototypeउदाहरण के लिए नहीं) और अक्सर एक-लाइनर, जबकि जनरेटर बहुत विपरीत होते हैं।
बर्गी

38
मैं पहले से ही कुछ परिदृश्यों में भाग चुका हूं जहां एक जनरेटर जिसे मैं पिछले उपयोग के लिए आवश्यक पहुंच के साथ खेल रहा था this, और let self = thisजनरेटर के अंदर इसे प्राप्त करने के लिए हैक लिखना पड़ा । लेक्सिकल स्कोप + एरो सिंटैक्स अच्छा होता। दुर्भाग्यपूर्ण है, लेकिन दुनिया का अंत नहीं।
DVlsg

3
इस बारे में कुछ अतिरिक्त संदर्भ esdiscuss
निक टोमलिन

20
@ बर्गी तीर के कार्यों के पीछे तर्क उससे कहीं अधिक जटिल है। यह वास्तव में संक्षिप्तता के बारे में नहीं है। एरो फ़ंक्शंस को हल्का होने की ज़रूरत नहीं है - यह सच है कि एक वैकल्पिक एकल-स्टेटमेंट बॉडी सिंटैक्स है, लेकिन ऐसा क्या है। कई लोग क्लास के तरीकों को छोड़कर सभी फ़ंक्शन परिभाषाओं के लिए तीर का उपयोग करते हैं, और functionकीवर्ड को भाषा का 'खराब हिस्सा' होने के लिए समर्पित करते हैं। ऐसा करने के लिए अच्छे कारण हैं। इन लोगों के लिए, तीर जनरेटर की कमी एक कष्टप्रद असंगति है।
काल

131

इनलाइन-फ़ंक्शंस और एरो-फ़ंक्शंस के बीच अंतर

सबसे पहले एरो-फ़ंक्शंस () => {} इनलाइन-फ़ंक्शंस को बदलने के लिए नहीं बने function(){}हैं और वे अलग हैं। इनलाइन-फ़ंक्शंस बस फ़ंक्शंस हैं, इसलिए सवाल यह है कि एरो-फ़ंक्शंस और इनलाइन-फ़ंक्शंस के बीच अंतर क्या है।

एक एरो फंक्शन एक्सप्रेशन (एरो फंक्शन के रूप में भी जाना जाता है) में फंक्शन एक्सप्रेशंस की तुलना में एक छोटा सिंटैक्स होता है और यह अपने आप को बांधता नहीं है this , arguments, super, या new.target)। एरो फ़ंक्शंस हमेशा गुमनाम होते हैं।

कुछ और त्वरित विवरण यहाँ


एरो-फंक्शन का उपयोग जनरेटर के रूप में क्यों नहीं किया जा सकता है

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

उपज कीवर्ड का उपयोग

उपज कीवर्ड (जब कार्यों आगे यह भीतर नेस्ट के भीतर अनुमति के अलावा) एक तीर समारोह के शरीर में इस्तेमाल नहीं किया जा सकता है। परिणामस्वरूप, तीर फ़ंक्शन को जनरेटर के रूप में उपयोग नहीं किया जा सकता है।

ध्यान दें कि बिना जनरेटरyield मतलब नहीं है।


एरो-फंक्शन उपज का उपयोग क्यों नहीं कर सकते हैं

http://tc39wiki.calculist.org/es6/arrow-functions/

एरो फ़ंक्शंस को thisशाब्दिक रूप से बाँधते returnहैं, ब्लॉक बॉडी केस में बाँधते हैं ताकि यह तुरंत एंकलोज़िंग एरो फंक्शन से लौटे, और डुप्लिकेट breakऔरcontinue फ़ौरन एनक्लोज़िंग एरो फंक्शन के बाहर स्टेटमेंट्स को संदर्भित करें।

पहचानकर्ता प्राथमिक अभिव्यक्तिarguments एक तीर समारोह के शरीर में नहीं किया जा सकता है (चाहे अभिव्यक्ति या ब्लॉक फार्म)।

इसी तरह, yieldएक तीर समारोह के शरीर में इस्तेमाल नहीं किया जा सकता है। तीर जनरेटर नहीं हो सकते हैं और हम गहरी निरंतरता नहीं चाहते हैं।

एरो-फंक्शन में यील्ड फेंक देंगे सिमेंटिक एरर: http://www.ecma-international.org/

अंत में कारण ECMA6 के कार्यान्वयन में गहरी जटिलता में है। C # इसे कुछ समान कारणों से अनुमति नहीं देता है


3
मैंने एक खोज इंजन का उपयोग किया और आपके लिए एक और स्पष्टीकरण पोस्ट किया
CoderPi

1
मुझे अभी भी लगता है कि इसके बारे में स्पष्टीकरण जोड़ने ()=>{}से एक इन-लाइन फ़ंक्शन से इसके अंतर को समझने में बहुत मदद मिलेगी, और जनरेटर के लिए सीमा क्यों है।
महत्वपूर्ण-

63
मैं यह पता लगाने की कोशिश कर रहा हूं कि *() => { yield bla; }ठीक क्यों नहीं है, लेकिन async () => { await bla; }यह है ...
ली बेन्सन

7
@CodeiSir, Re " और हम गहरी निरंतरता नहीं चाहते हैं ", घटिया बहाने।
पेसियर

9
आपका तर्क चक्रीय है। आप कहते हैं कि तीर फ़ंक्शंस जनरेटर नहीं हो सकते हैं क्योंकि उनमें उपज का कीवर्ड नहीं हो सकता है। लेकिन उनके पास उपज कीवर्ड नहीं हो सकता है, क्योंकि वे जनरेटर नहीं हो सकते हैं: "तीर जनरेटर नहीं हो सकते हैं और हम गहरी निरंतरता नहीं चाहते हैं।"
Thayne

35

नवंबर 2013 से esdiscuss.org और एक्मा TC39 समिति ES6 बैठक के नोटों पर चर्चा के अलावा , जनरेटर तीर दो सितंबर 2016 ES7 बैठकों [1] [2] में फिर से जारी किए गए थे । विभिन्न सिंटैक्स (मुख्य रूप से =*>और =>*) के पेशेवरों और विपक्षों के बारे में चर्चा और इस सुविधा के लिए औचित्य और उपयोग के मामलों की कमी के बाद, वे इस निष्कर्ष पर पहुंचे कि:

  • समिति की ओर से कुछ रुचि है, लेकिन यह चिंता है कि नए सिंटैक्स के नए टुकड़े को जोड़ने के लिए यह सुविधा अपना वजन नहीं बढ़ाती है
  • 3 दिन पर फिर से देखने की योजना बनाएं कि क्या हम =>*मंच पर कम से कम, [डॉमिक डेनिकोला] के async पुनरावृत्ति प्रस्ताव के हिस्से के रूप में प्राप्त कर सकते हैं

चैंपियन के रूप में ब्रेंडन ईच और डोमिनिक डेनिकोला के साथ जनरेटर तीर का प्रस्ताव चरण 1 में स्थानांतरित किया गया था । ऊपर उल्लिखित अतुल्यकालिक पुनरावृत्ति 2018 में समाप्त और कार्यान्वित की गई थी।

अक्टूबर 2019 में सेर्गेई रुबानोव द्वारा एक आधिकारिक रेपो वाक्यविन्यास और अन्य विवरणों के बारे में अधिक चर्चा के साथ दिखाई दिया।


8

मैं भी यही सवाल कर रहा था और यहां आया था। पोस्ट और टिप्पणियों को पढ़ने के बाद, मुझे लगा कि एक तीर फ़ंक्शन में जनरेटर का उपयोग अस्पष्ट लगता है:

const generator = () => 2*3; // * implies multiplication
// so, this would be a confusing
const generator = () =>* something; // err, multiplying?
const generator = () =*> ... // err, ^^
const generator = ()*=> ... // err, *=3, still multiplying?
const generator=*()=> ... // err, ^^
const generator = *param => ... //err, "param" is not fixed word

यह वह बड़ा कारण हो सकता है कि वे तीर फ़ंक्शन के संबंध में जनरेटर को लागू नहीं करते हैं।


लेकिन, अगर मैं उनमें से एक था, तो मैं इस तरह सोच सकता था:

const generator = gen param => ... // hmm, gen indicates a generator
const generator = gen () => ... // ^^

ऐसा लगता है जैसे हमारे पास अतुल्यकालिक फ़ंक्शन है:

const asyncFunction = async () => ... // pretty cool

क्योंकि, सामान्य फ़ंक्शन के साथ async कीवर्ड मौजूद है, इसलिए एरो फ़ंक्शन इसका उपयोग कर रहा है - async () =>प्रतीत होने की संभावना है async function()

लेकिन, इसके जैसा कोई कीवर्ड नहीं है genया generatorअलास एरो फ़ंक्शन इसका उपयोग नहीं कर रहा है।

समाप्त करने के लिए:

भले ही वे तीर फ़ंक्शन में जनरेटर को लागू करना चाहते हैं, मुझे लगता है कि उन्हें कोर जेएस में जनरेटर सिंटैक्स के बारे में फिर से सोचने की जरूरत है:

generator function myfunc() {}
// rather than
function* myfunc() {} // or, function *myfunc() {}

और यह एक बड़ी गड़बड़ी होगी। इसलिए, जनरेटर से एरो फ़ंक्शन को बाहर रखना, बहुत अच्छा है।


@Bergi टिप्पणी के बाद :

नहीं, एरो फ़ंक्शंस को हल्के-वजन वाला माना जाता है (और उदाहरण के लिए एक .prototyp नहीं है) और अक्सर एक-लाइनर, जबकि जनरेटर बहुत विपरीत हैं।

मैं कहूंगा कि उपयोग करने के लिए जनरेटर का उद्देश्य रन-स्टॉप-रन है और इसलिए मुझे नहीं लगता कि हमें प्रोटोटाइप, लेक्सस, आदि के बारे में देखभाल करने की आवश्यकता है।


2
विदेशी विकल्पों पर भी विचार कर सकते हैं, जैसे () ~> { yield 'a'; yield 'b'; }। सच कहूं तो मुझे सिर्फ टिल्ड्स से प्यार है।
गर्सहोम

@Gershom यह कैसे की तरह प्रोग्रामिंग भाषाओं है पर्ल पूरी तरह से बिगड़ जाए
Sapphire_Brick

2

मुझे पता है कि यह बहुत देर हो चुकी है, लेकिन एक और संभावित कारण वाक्यविन्यास हो सकता है। शायद (*() => {})काम करता है, लेकिन क्या (9 ** () => {})? क्या वह 9 एरो फंक्शन की शक्ति है, लौट रहा है NaN, या यह 9 बार एक जनरेटर एरो फंक्शन है, भी लौट रहा है NaN? यह कुछ विकल्प वाक्य रचना के साथ किया जा सकता है, की तरह =>*के रूप में यहाँ एक और उत्तर से उल्लेख किया है, लेकिन शायद वहाँ जनरेटर समारोह वाक्य रचना की निरंतरता (जैसे। संरक्षित करने के लिए एक इच्छा थी function* () {}और { *genMethod() {} }) जब इसे लागू किया जा रहा है। बहुत अधिक बहाना नहीं है, लेकिन इसके लिए एक कारण है।


1
: +1: डबल तारांकन के लिए ... यहां पुराना स्कूल JS लड़का है। कौन कहता है कि आप एक पुराने कुत्ते को नए गुर नहीं सिखा सकते हैं: खुशी:
शनीमल

एकमात्र कारण वे ऐसा नहीं करते हैं, क्योंकि पार्सर बनाना मुश्किल है। यह पूरी तरह से संभव है और सिंटैक्स में कोई समझौता करने की आवश्यकता नहीं है।
जेसन मैकरेल

@JasonMcCarrell यदि वे पार्सर को बहुत जटिल नहीं बनाने के बारे में पर्याप्त देखभाल करते हैं, तो शायद ब्रेंडन ईच को ब्राउज़र में स्कीम डालनी चाहिए।
नीलमणि ०१

1

अभी आप नहीं कर सकते हैं, लेकिन भविष्य में आप हो सकते हैं क्योंकि TC39 अक्टूबर 2019 में उसी के लिए प्रस्ताव जारी करता है, जो चरण 1 में है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.