Могу ли я использовать синтаксис функции стрелки ES6 с генераторами? (обозначение стрелки)
т. е. как мне выразить это:
function *(next) {}
со стрелами. Я пробовал все комбинации, которые мог придумать, и я не могу найти никакой документации по нему.
(в настоящее время используется узел v0. 11. 14)
5 ответов:
могу ли я использовать синтаксис функции стрелки ES6 с генераторами?
вы не можете. К сожалению.
по данным MDN
The
function*
заявление (function
ключевое слово, за которым следует звездочка) определяет функцию генератора.С spec document (Курсив мой):
The функции синтаксис расширен, чтобы добавить необязательный
*
токен:FunctionDeclaration: "function" "*"? Identifier "(" FormalParameterList? ")" "{" FunctionBody "}"
разница между встроенными функциями и стрелками-функциями
в первую очередь стрелка-функции
() => {}
не предназначены для замены встроенных функцийfunction(){}
и они разные. Встроенные функции-это просто функции, поэтому вопрос заключается в том, в чем разница между функциями-стрелками и встроенными функциями.выражение функции стрелки (также известное как функция стрелки) имеет более короткий синтаксис по сравнению с выражениями функции и не связывает его самостоятельно
this
,arguments
,super
илиnew.target
). Функции стрелки всегда анонимны.еще несколько быстрых деталей здесь
почему стрелка-функция не может быть использована в качестве генераторов
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions
использование ключевого слова yield
в доходность ключевое слово не может использоваться в теле функции стрелки (за исключением случаев, когда это разрешено в функциях, дополнительно вложенных в него). Как следствие, функции стрелок не могут использоваться в качестве генераторов.
отметим, что генераторы без
yield
нет смысла.
почему стрелка-функция не может использовать yield
http://tc39wiki.calculist.org/es6/arrow-functions/
стрелки функции привязки
this
лексически, связыватьreturn
на блок корпус корпуса, поэтому он возвращается из функции немедленно заключающей стрелки и исключаетbreak
иcontinue
от ссылок на операторы вне непосредственно заключающей функции стрелки.The идентификатор первичное выражение
arguments
не может использоваться в теле функции стрелки (будь то выражение или форма блока).кроме того,
yield
может и не быть используется в теле функции стрелки. Стрелки не могут быть Генераторами, и мы не хотим глубоких продолжений.выход в стрелку-функция выдаст семантическую ошибку:http://www.ecma-international.org/
в конце концов причина заключается в глубокой сложности в реализации ECMA6. C# не допускает этого и для несколько похожих причины.
В дополнение к обсуждению esdiscuss.org и комитет ЕС6 Ecma TC39 отмечает встречу с ноября 2013 года упомянутые выше, стрелки генератора были пересмотрены в двух встречах ES7 сентября 2016 года [1][2]. После обсуждения плюсов и минусов различного синтаксиса (в основном
=*>
и=>*
) и отсутствие обоснований и вариантов использования этой функции, они пришли к выводу, что:
- есть некоторый интерес со стороны комитета, но озабоченность тем, что функция не тянет свой вес для добавления нового синтаксиса
- планируем вернуться на День 3, чтобы увидеть, если мы можем получить
=>*
к этапу 0 по крайней мере, как часть предложения асинхронной итерации [Domenic Denicola]предложение о генераторных стрелках было перенесено на Этап 1 с Бренданом Эйхом и Домиником Дениколой в качестве чемпионов, но соответствующее tc39/предложения РЕПО еще не существует. Я предполагаю, что для дальнейших новостей нужно подождать, пока не будет завершено предложение асинхронной итерации этапа 3.
Я знаю, что это очень поздно, но другой возможной причиной может быть синтаксис. может быть
(*() => {})
работает, но как насчет(9 ** () => {})
? Это 9 в силу функции стрелки, возвращающейNaN
, или это 9 раз функция стрелки генератора, также возвращающаяNaN
? Это можно сделать с помощью некоторого альтернативного синтаксиса, например=>*
как уже упоминалось в другом ответе здесь, но, возможно, было желание сохранить согласованность синтаксиса функции генератора (например.function* () {}
и{ *genMethod() {} }
) когда это было осуществляется. Не повод, но причина для этого.