为什么 result2.value = Yoshi(冒名顶替者)不是鬼鬼祟祟的?

Why isn’t result2.value = Yoshi (imposter) skulk?

在第三个断言中,我对冒名顶替者返回半藏的原因感到困惑。我意识到我们在第一个断言中重新声明冒名顶替者等于半藏,但断言不是评价性的并且不应该产生表达式吗? Imposter 也是一个常量,如何以及何时重新分配 Imposter?

function assert(bool, msg) {
  if (!bool) {
    console.warn(msg);
  }
}

function* NinjaGenerator(action) {
  const imposter = yield("bob " + action);

  assert(imposter === "Hanzo",
    "The generator has been infiltrated");

  yield("Yoshi    (" + imposter + ") " + action);
}

const ninjaIterator = NinjaGenerator("skulk");

const result1 = ninjaIterator.next();
assert(result1.value === "bob skulk", "bob is skulking");

const result2 = ninjaIterator.next("Hanzo");
assert(result2.value === "Yoshi (Hanzo) skulk",
  "We have an imposter!");

我希望最后一个断言能够通过“Yoshi(冒名顶替者)skulk”

因为 yield 位于 imposter 赋值的右侧,所以变量唯一的值是 "Hanzo"。也就是说,生成器 returns 在赋值发生之前的第一次。

那你打电话

const result2 = ninjaIterator.next("Hanzo");

imposter 变量的 const 初始化实际上发生在传入值 "Hanzo" 上。当达到下一个 yield 时,imposter 的值就是您看到的那个值。

了解对 NinjaGenerator 的初始调用只是创建 Iterator 对象并将值绑定到参数。在第一次调用 .next() 之前,什么都没有发生。第一次调用将导致计算 const 初始化表达式,等等