Javascript 为什么ES6是;“收益率”;在这种上下文中调用时是保留字吗?

Javascript 为什么ES6是;“收益率”;在这种上下文中调用时是保留字吗?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我正在使用节点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)); ^^^^

我正在使用节点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);
}
“严格使用”;
函数*生成器(){
设数=[1,2,3,4,5];
设higherNumbers=numbers.map(n=>n+1);

对于(设i=0;i这是因为arrow函数不是生成器。如果我展开arrow函数,它将类似于:

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

function*generator(){/这是因为箭头函数不是生成器函数。例如

function temp() {
  yield 1;
}
我们能指望它工作吗?不能。因为
temp
不是一个生成器函数。同样的情况也适用于箭头函数


FWIW,根据ECMAScript 2015规范,在箭头函数中使用
yield
是一个早期错误

箭头函数:箭头参数=>ConciseBody

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

  • 如果ConciseBody Contains yieldesxpression为true,则为语法错误


你可以做任何事情,但不能做所有事情–学会授权

让我们首先看两个例子

1.收益率

函数*发生器(数字){
产量数字.map(x=>x+1);
}
对于(发电机([1,2,3])的(设n)console.log(n);

//[2,3,4]
刚刚发现,如果过早意外关闭函数,可能会遇到这种情况

i、 e.太多的
}

[1,2,3,4,5].map(function*(v){yield v+1;}).reduce((accumulator, currentValue) => accumulator = [...accumulator].concat([...currentValue]))
解释

[1,2,3,4,5].map(function*(v){yield v+1;})
将所有值打包到生成器中

(5) [发电机,发电机,发电机,发电机,发电机]

展开成平面阵列

.reduce((accumulator, currentValue) => accumulator = [...accumulator].concat([...currentValue]))
(5) [2,3,4,5,6]

正常使用

[1,2,3,4,5].map(function*(v){yield v+1;}).forEach(v => console.log([...v][0]))
二,

三,

四,

五,

六,


[…v][0]有点难看,但它是有效的。

您只能从生成器中
生成
而不能从它们内部的
map
回调。就像您不能从外部函数中
返回
一样。请尝试
生成*numbers.map(n=>n+1);
太挑剔了,太挑剔了。