Javascript 为什么Generator.prototype.return接受一个值?

Javascript 为什么Generator.prototype.return接受一个值?,javascript,iterator,generator,Javascript,Iterator,Generator,我试图弄清楚为什么Generator.prototype.return接受一个值 我发现它会停止生成器的处理,并使用以下内容呈现每个下一个调用: { done: true, value: undefined, } 但是,当您向它传递一个值,例如generator.return(4),它所做的就是返回一个对象,就像您调用了generator.prototype一样。接下来,您的值是4 我唯一的猜测是,这在组合生成器或进行某种双向通信时可能很有用;尽管如此,由于它切断了发电机,双向

我试图弄清楚为什么
Generator.prototype.return
接受一个值

我发现它会停止生成器的处理,并使用以下内容呈现每个
下一个
调用:

{
    done: true,
    value: undefined,
}
但是,当您向它传递一个值,例如
generator.return(4)
,它所做的就是返回一个对象,就像您调用了
generator.prototype一样。接下来
,您的
值是4

我唯一的猜测是,这在组合生成器或进行某种双向通信时可能很有用;尽管如此,由于它切断了发电机,双向通信没有多大意义。

该方法具有一个值,因为它以与和相同的方式提供双向通信

yield
表达式可能有3种不同的结果:

  • 它可以像一个简单的表达式一样计算,得到该表达式的结果值
  • 它可以像一个
    throw
    语句一样进行计算,从而导致异常
  • 它可以像
    return
    语句一样进行计算,导致在结束函数之前只计算
    finally
    语句
  • (第四种可能的结果是发电机从未恢复)
通过使用相应的值调用挂起的生成器上的相应方法来实现。这包括异常值和返回值

但是,当您向它传递一个值,例如
generator.return(4)
,它所做的就是返回一个对象,就像您调用了
generator.prototype一样。下一步
,您的值属性是
4

不一定。您可能会认为,当计算
return
语句时,它总是返回该返回值,并且与
throw
语句中的异常不同,它无法被截获。的确,在生成器函数中无法访问返回值,但可以通过
finally
子句抑制或更改返回值

[函数*exampleA(){
尝试{yield;}最后{}
},
函数*exampleB(){
试试{yield;}最后{yield'Y';}
},
函数*exampleC(){
尝试{yield;}最后{return'Z';}
},
函数*exampleD(){
试试{yield;}最后{throw'E}
}
].forEach(genFn=>{
试一试{
const gen=genFn();
下一代();
控制台日志(gen.return('X'));
}捕获(e){
控制台日志(e);
}
});