为什么在这种情况下调用ES6会产生一个保留字?

我正在使用节点4.1.1。 当我运行这个代码

"use strict"; function *generator() { let numbers = [1,2,3,4,5]; numbers.map(n => yield (n + 1)); } for (var n of generator()) { console.log(n); } 

我得到这个错误

  numbers.map(n => yield (n + 1)); ^^^^^ SyntaxError: Unexpected strict mode reserved word 

如果我重新排列代码是这​​个

 "use strict"; function *generator() { let numbers = [1,2,3,4,5]; let higherNumbers = numbers.map(n => n + 1); for(let i=0;i<higherNumbers.length;i++) { yield higherNumbers[i]; } } for (var n of generator()) { console.log(n); } 

我得到了预期的结果。

为什么第二个工作,第一个失败? 当然,如果一个关键字是保留的,它将被保留在所有上下文中,而不仅仅是当它用在箭头函数中时。

这是因为箭头函数不是生成器函数。 例如,

 function temp() { yield 1; } 

我们可以期待这个工作吗? 没有,因为temp不是一个生成器函数。 这同样适用于箭头function。


FWIW,根据ECMAScript 2015规范,在Arrow函数中yield的使用是一个早期错误,按照本节 ,

ArrowFunction:ArrowParameters => ConciseBody

  • 如果ArrowParameters包含YieldExpression真,则它是一个语法错误。

  • 如果ConciseBody包含YieldExpression真,则它是一个语法错误。

你可以做任何事情,但不是一切 – 学习委派

我们先来看两个例子

收益率

 function* generator(numbers) { yield numbers.map(x => x + 1); } for (let n of generator([1,2,3])) console.log(n); // [ 2, 3, 4 ] 

那是因为箭头函数不是一个生成器。 如果我展开你的箭头function,它会看起来像这样:

 function *generator() { // <-- this is your generator function let numbers = [1,2,3,4,5]; numbers.map(function(n){ // <-- this one isn't a generator yield (n + 1) // <-- there's your yield }.bind(this)); }