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);
}
});代码>