一尘不染

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

node.js

我正在使用节点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);
}

我得到了预期的结果。

为什么第二个起作用,而第一个失败?可以肯定的是,如果关键字是保留关键字,那么它在所有上下文中都是保留的,而不仅仅是在箭头函数中使用时?


阅读 231

收藏
2020-07-07

共1个答案

一尘不染

这是因为箭头功能不是生成器功能。例如,

function temp() {
  yield 1;
}

我们可以期望它起作用吗?否。因为temp不是生成器函数。同样适用于箭头功能。


FWIW,根据yieldECMAScript 2015规范(如本节所述),箭头功能的使用是早期错误,

ArrowFunction:ArrowParameters = > ConciseBody

  • 如果 ArrowParameters 包含 YieldExpression true ,则为语法错误。

  • 如果 ConciseBody 包含 YieldExpressiontrue ,则为语法错误。

2020-07-07