为什么 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
初始化表达式,等等
在第三个断言中,我对冒名顶替者返回半藏的原因感到困惑。我意识到我们在第一个断言中重新声明冒名顶替者等于半藏,但断言不是评价性的并且不应该产生表达式吗? 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
初始化表达式,等等