Javascript 为什么ES6是;“收益率”;在这种上下文中调用时是保留字吗?
我正在使用节点4.1.1。当我运行此代码时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)); ^^^^
"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);
太挑剔了,太挑剔了。