Javascript生成器函数yield未在变量中赋值

Posted

技术标签:

【中文标题】Javascript生成器函数yield未在变量中赋值【英文标题】:Javascript generator function yield is not assigning value in variable 【发布时间】:2021-04-16 04:38:04 【问题描述】:

javascript生成器中使用yield时遇到问题。让我们先看看我的代码-

function* gen(a, b) 
  let k = yield a + b;
  let m = yield a + b + k;
  yield a + b + k + m;


let x = gen(10, 20);

console.log(x.next());
console.log(x.next());
console.log(x.next());

在上面的代码中,在我第一次运行 next() 时,它给了我 30 的值。但是当我第二次尝试时,在第二次 next() 中,它给了我一个 NAN 值。这意味着,yield没有在k中赋值a+b的值。而是直接移到下一行。但我认为,它应该先给k赋值。

这里发生了什么?如果你知道,请告诉我。

【问题讨论】:

【参考方案1】:

在生成器中,表达式:

yield <someExpression>

计算值传入生成器.next,像这样:

function* gen(a, b) 
  const valPassedIn = yield 'foo';
  console.log('valPassedIn', valPassedIn);


let x = gen(10, 20);

const containsFoo = x.next();
x.next(123);

在你的代码中,因为你没有用任何东西调用.next,所以km 都是undefined,所以它们不能是+d 任何东西(它们会产生NaN )。

对于听起来像你想要的,计算总和,得到它,然后将它分别分配给k

function* gen(a, b) 
  let k = a + b;
  yield k;
  let m = a + b + k;
  yield m;
  yield a + b + k + m;


let x = gen(10, 20);

console.log(x.next());
console.log(x.next());
console.log(x.next());

【讨论】:

【参考方案2】:

km 仍未定义,因为对它们的分配是在yield 完成之后。在yield

之前为各个变量赋值

function* gen(a, b) 
  k = a + b;
  yield k;
  m = a + b + k
  yield m;
  yield a + b + k + m;


let x = gen(10, 20);
console.log(x.next());
console.log(x.next());
console.log(x.next());

【讨论】:

【参考方案3】:

因为kundefined 我们第一次运行next()

【讨论】:

以上是关于Javascript生成器函数yield未在变量中赋值的主要内容,如果未能解决你的问题,请参考以下文章

javascript - 使用另一个函数中的变量 javascript - '今天未在对象中定义'

ReferenceError StringBuilder 未在 javascript 中定义

在变量中设置生成器函数的结果[重复]

ES6新特性:Javascript中Generator(生成器)

python 的生成器,yield的使用

python中yield的用法(生成器的讲解)