ES6 is so ES6

Mar 08, 2016 03:14

Загадка 1: что выводит этот код?
Загадка 2: почему он это выводит?

var i = f();
function* f() {
    console.log("A");
    console.log(i.next(2));
    console.log("B");
    console.log(yield 1);
    console.log("C");
}
console.log(i);

Leave a comment

Comments 8

ex_juan_gan March 8 2016, 00:30:26 UTC
Не помню, что за звездочка, но я бы ожидал undefined.
Но вышло вот что:

f {[[GeneratorStatus]]: "suspended", [[GeneratorReceiver]]: Window}

Reply

udpn March 8 2016, 00:47:32 UTC
Генераторы это новомодные такие.

У меня вот Node.js говорит {}.

А вообще требовать следующего значения от генератора в момент генерации значения как бы слегка странно, и я считаю, что интерпретатор должен упасть с кровавым сообщением об ошибке, а не делать вид, что так и положено, нарушая инвариант языка.

Вот даже ребята говорят:
Calling boost::coroutines::coroutine<>::operator() from inside the same coroutine results in undefined behaviour.

Но в Boost хотя бы простительно, там люди вообще ассемблерными вставками сопроцедуры добавляют. В более здоровых языках undefined behaviour это что-то новенькое. Прямо появилось желание походить-поломать всякие PHP и Python.

Reply

sassa_nf March 8 2016, 07:52:00 UTC
ну там, видимо, проперти как-то хитро определены. Если console.log(i.toString()), то таки видно, что [object Generator]

Reply


klonkaktusa March 8 2016, 02:09:59 UTC
1 текстовое представление объекта-генератора
2 http://exploringjs.com/es6/ch_generators.html#_what-are-generators

Reply

udpn March 8 2016, 06:15:40 UTC
1. Нет, генератор уже вызвали.
2. Нет, что-то я не вижу в этом документе ничего похожего.

Reply

klonkaktusa March 8 2016, 07:15:59 UTC
Вызвали функцию-генератор, которая вернула новый объект-генератор, по которому можно итерировать. При этом код внутри функции еще не выполнялся. Если вместо console.log(i) написать i.next(), тогда начнет выполнятся код функции, наткнется на i.next(2) и упадет с ожидаемым TypeError.

Reply

udpn March 8 2016, 07:20:59 UTC
UPD. А, вы про такой TypeError. Не обратил внимания.

Reply


sassa_nf March 8 2016, 07:39:10 UTC
текстовое представление генератора, т.к. f() его только создает. А вот конструкция генератора такая, что по-хорошему должна наступить ⊥ (i.next() начинает ожидать до того, как наступил yield), а что выдаст интерпретатор - это дело такое.

Reply


Leave a comment

Up