У меня есть кусок кода:Понимание генератора JavaScript в
function * input(){
let array = [];
while(true) {
array.push(yield array);
}
}
var gen = input();
console.log(gen.next("A"))
console.log(gen.next("B"))
console.log(gen.next("C"))
console.log(gen.next("D"))
Когда вы запустите ее, вы получите следующий результат:
{ value: [], done: false }
{ value: [ 'B' ], done: false }
{ value: [ 'B', 'C' ], done: false }
{ value: [ 'B', 'C', 'D' ], done: false }
Почему первая строка результата не включает A
в массиве? Существует одно объяснение с этой страницы: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#Passing_arguments_into_Generators. Комментарий говорит
первый вызов следующего() не выполняется с самого начала функции до первого оператора выхода
Но из моего тестирования, кажется, не правильно. Мой код тестирования:
function* logGenerator() {
console.log("before yield in function");
yield 1;
console.log("filler 1");
yield 2;
console.log("filler 2");
yield 3;
console.log("filler 3");
}
var gen = logGenerator();
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
Результат:
before yield in function
{ value: 1, done: false }
-----------------
filler 1
{ value: 2, done: false }
-----------------
filler 2
{ value: 3, done: false }
-----------------
filler 3
{ value: undefined, done: true }
Как вы можете видеть, первый next()
не только выполнил заявления перед первым yield
, но и первый yield
заявление. Так что теория не может объяснить мой вопрос. Может ли кто-нибудь помочь мне указать правильное направление? Заранее спасибо.
Оператор доходности должен иметь преимущество. –
Это интересно. running 'console.log (gen.next());' сначала дает ожидаемый результат –