我正在使用节点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不是生成器函数。同样适用于箭头功能。
temp
FWIW,根据yieldECMAScript 2015规范(如本节所述),箭头功能的使用是早期错误,
yield
ArrowFunction:ArrowParameters = > ConciseBody 如果 ArrowParameters 包含 YieldExpression 为 true ,则为语法错误。 如果 ConciseBody 包含 YieldExpression 为 true ,则为语法错误。
ArrowFunction:ArrowParameters = > ConciseBody
如果 ArrowParameters 包含 YieldExpression 为 true ,则为语法错误。
如果 ConciseBody 包含 YieldExpression 为 true ,则为语法错误。