为什么在这种情况下调用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)); }