面试题答案
一键面试当生成器函数通过yield
关键字暂停执行时:
- 局部变量:生成器函数内部的局部变量会保持当前的值和状态。这意味着在暂停时,局部变量的值不会被重置或销毁,当生成器函数恢复执行(通过
next()
方法)时,这些局部变量会保持暂停前的值继续使用。例如:
function* myGenerator() {
let num = 1;
yield num;
num++;
yield num;
}
let gen = myGenerator();
console.log(gen.next().value); // 输出1
console.log(gen.next().value); // 输出2
在这个例子中,num
变量在第一次yield
暂停后,第二次恢复执行时其值是1
,并在执行num++
后,第二次yield
时输出2
,说明num
的值在暂停期间得到了保留。
- 相关数据:与生成器函数执行上下文相关的其他数据,如函数调用栈的状态(尽管生成器函数执行不是传统意义上的连续调用栈方式)、作用域链等也会被保留。生成器函数的执行上下文会被挂起,以便后续能够从暂停的位置继续执行,就像执行流程被冻结在
yield
语句处,等待next()
方法触发恢复。