ES6 функциясының синтаксисін генераторлармен бірге пайдалана аламын ба? (көрсеткі белгілеу)

яғни оны қалай білдіруге болады:

 function *(next) {} 

көрсеткілерімен. Мен ойлануға болатын барлық комбинацияларды қолдануға тырыстым, мен оған ешқандай құжаттарды таба алмаймын.

(қазіргі уақытта v0.11.14 түйіні пайдаланатын)

169
26 дек. Эшли Куллман тағайындалды 26 желтоқсан 2014-12-26 22:51 '14 сағат 22: 51-де 2014-12-26 22:51
@ 7 жауап

ES6 функциясының синтаксисін генераторлармен пайдалану мүмкін бе?

Сіз жасай алмайсыз. Кешіріңіз.

MDN деректері бойынша

function* ( function жұлдызшамен) функция генераторын анықтайды.

Техникалық құжатта (менің акцентім):

Функцияның синтаксисі қосымша таңбаны * қосу үшін кеңейтілген:

 FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" "{" FunctionBody "}" 
149
26 дек. жауап 26 желтоқсан күні пайдаланушы663031 арқылы беріледі . 2014-12-26 23:03 '14 сағат 23:03 2014-12-26 23:03

Кірістірілген функциялар мен Arrow функциялары арасындағы айырмашылық

Ең алдымен, Көрсеткі функциялары () => {} кіріктірілген функциялар function(){} ауыстырмайды және олар әр түрлі. Ендірілген функциялар тек қана функциялар болып табылады, сондықтан мәселе - Arrow және Inline функциялары арасындағы айырмашылық.

Көрсеткі функциясының өрнегі (көрсеткі функциясы ретінде де белгілі) функцияның сөйлемшесімен салыстырғанда қысқа синтаксисі бар және өздігінен, arguments , super немесе new.target ) new.target . Көрсеткі функциялары үнемі жасырын.

Мұнда кейбір жылдамырақ мәліметтер .


Неге Arrow функциясы генератор ретінде пайдаланыла алмайды

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

Кілт сөздің кірістілігін пайдаланыңыз

Берілген кілт сөзді көрсеткі функциясының корпусында қолдануға болмайды (ішкі ішіндегі кірістірілген функцияларға кірмейді). Нәтижесінде көрсеткілердің функцияларын генератор ретінде пайдалануға болмайды.

border=0

Өнімділігі жоқ генераторлар мағынасы жоқ екенін ескеріңіз.


Неге Arrow функциясы кірістілікті пайдалана алмайды

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

Көрсеткілердің функциялары this лексикалық түрде байланады, блоктың корпусына қайтарылады, осылайша көрсеткілерді бірден қоршау функциясынан қайтарады және break жасамайды және тікелей шегінің көрсеткі функциясынан тыс мәлімдемелер сілтемелерінен continue .

Бастапқы өрнек Идентификатор arguments көрсеткі функциясының (өрнек немесе блок нысаны) корпусында пайдаланылмайды.

Сол сияқты, yield көрсеткі функциясының денесінде қолданыла алмайды. Көрсеткілер генераторлар бола алмайды, және біз терең ізденістерді қаламаймыз.

Көрсеткі бар функцияны енгізу семантикалық қатені тудырады: http://www.ecma-international.org/

Ақыр соңында, себебі ECMA6-ны енгізуде қиындық туғызады. C # осыған ұқсас бірнеше себепке жол бермейді.

94
05 дек. CoderPi 05 желтоқсан күні жауап берді. 2015-12-05 19:42 '15 at 7:42 pm 2015-12-05 19:42

Жоғарыда айтылған 2013 жылдың қарашасында қабылданған esdiscuss.org және Ecma TC39 ES6 комитетінің пікірталастарынан басқа, генераторлық бомбалар 2016 жылдың қыркүйегінде ES7 отырыстарында қайта қаралды [1] [2] . Әртүрлі синтаксистердің (негізінен =*> және =>* ) артықшылықтары мен кемшіліктерін талқылағаннан кейін, осы функция үшін ақаудың жоқтығы мен пайдалану жағдайлары анықталды, олар:

  • Комитетке қызығушылық бар, бірақ алаңдаушылық мынада, функция жаңа синтаксисті қосу үшін салмағын тартып алмайды.
  • 3-ші күнге оралуды жоспарлап көру үшін, 0-қадамға дейін, ең болмағанда, асинхронды прогресс ұсынысы [Domenic Denicola].
Генератордың ұсынысы Brendan Eich және Dominic Denicola-мен жеңімпаз ретінде 1-ші сатыға ауыстырылды, бірақ тиісті tc39 / репо жобалары жоқ. Мен алдағы жаңалықтар үшін 3-ші кезеңнің асинхронды иерархиясы туралы ұсыныс аяқталғанша күте тұру керек деп ойлаймын.
22
07 дек. жауап 07 желтоқсанға дейін беріледі. 2016-12-07 14:03 '16 сағат 14:03, 2016-12-07 14:03

Мен бұл өте кеш екенін білемін, бірақ синтаксис басқа ықтимал себеп болуы мүмкін. мүмкін (*() => {}) жұмыс істейді, бірақ туралы (9 **() => {}) ? Қайтарылатын NaN функциясының дәрежесі 9, не ол генератордың көрсеткішінің 9-еселі функциясы ме, сондай-ақ NaN қайтарады? Бұл басқа жауапта айтылғандай, мысалы, =>* кейбір баламалы синтаксистерді қолдану арқылы жасалуы мүмкін, бірақ генераторлық функцияның синтаксисін дәйекті сақтауы мүмкін (мысалы, function*() {} және { *genMethod() {} } ) ол іске асырылған кезде. Үлкен кешірім емес, мұның себебі.

2
23 апр. жауап coolreader18 23 сәуiрде берiледi 2018-04-23 20:25 '18 сағат 20 : 25-те 2018-04-23 20:25

Менде де сол мәселе болды және мен осында келдім. Посттар мен түсініктемелерді оқығаннан кейін, мен генераторды көрсеткі бар функция ретінде қолданудың белгісіз екенін сезіндім:

 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 function() көрінуі мүмкін.

Бірақ gen немесе generator сияқты кілт сөз жоқ, және, өкінішке орай, көрсеткі функциясы оны қолданбайды.

Қорытынды:

Тіпті егер олар көрсеткі функциясында генераторды іске асырғысы келсе де, js ядросындағы генератордың синтаксисін қайта қарау керек деп ойлаймын:

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

Және бұл үлкен қателік болады. Осылайша, генератордан жебені ұстап тұру өте әдемі.


Келесі түсініктеме @Bergi :

Жоқ Көрсеткілердің функциялары жеңіл болуы керек (мысалы, .prototype емес) және жиі бір реттік болуы керек, ал генераторлар көбінесе керісінше болуы керек деп есептеледі.

Мен генератордың мақсаты старт-тоқтауды бастау деп айтатын боламын , сондықтан прототипті, лексикалық сөйлеуді және т.б. қажет деп ойлаймын.

0
01 февр. Жауап Bhojendra Rauniyar 01 ақпан. 2019-02-01 18:57 '19 сағат 18 : 57-те 2019-02-01 18:57

Мен мұны істедім:

 { [Symbol.iterator]: function * () { for (let element of elements) { yield element; } }.bind(this) } 
0
11 дек. Жауап NesCafe Zos42 11 желтоқсан. 2018-12-11 02:46 '18 at 2:46 2018-12-11 02:46

Redx-saga-мен жақсы шешім бар

 import { call, all } from 'redux-saga/effects'; function* gen() { yield all([].map(() => { return call(....); })); } 
0
11 авг. Julius Baltrušaitis 11 тамызда берген жауабы. 2018-08-11 15:58 '18 сағат 15 : 58- те 2018-08-11 15:58

тегтері туралы басқа сұрақтар немесе Сұрақ қою