6
 function*() { .... }

我刚刚在其他一些 js 代码中找到了这种定义形式,星号到底是什么意思?谢谢

4

2 回答 2

18

在 ES2015+ 中,它定义了一个生成器函数

下面是一个生成器的例子:

function* fibonacci() {
    let [prev, curr] = [0, 1];
    while (true) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

多种使用方式:

使用for-of循环(另一个 ES2015+ 事物):

for (const n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000) {
        break;
    }
    console.log(n);
}

例子:

function* fibonacci() {
    let [prev, curr] = [0, 1];
    while (true) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

for (const n of fibonacci()) {
    // truncate the sequence at 1000
    if (n > 1000) {
        break;
    }
    console.log(n);
}
.as-console-wrapper {
    max-height: 100% !important;
}

直接使用迭代器(for-of在幕后为你使用它):

const seq = fibonacci();
console.log(seq.next().value); // 1
console.log(seq.next().value); // 2
console.log(seq.next().value); // 3
console.log(seq.next().value); // 5
console.log(seq.next().value); // 8

function* fibonacci() {
    let [prev, curr] = [0, 1];
    while (true) {
        [prev, curr] = [curr, prev + curr];
        yield curr;
    }
}

const seq = fibonacci();
console.log(seq.next().value); // 1
console.log(seq.next().value); // 2
console.log(seq.next().value); // 3
console.log(seq.next().value); // 5
console.log(seq.next().value); // 8
.as-console-wrapper {
    max-height: 100% !important;
}

于 2014-04-25T05:55:44.573 回答
1

这里

带有 * 标记的函数称为生成器函数。以下两个一元运算符只允许在生成器函数的直接主体中使用(即,在主体中但不能嵌套在另一个函数中):

AssignmentExpression:
    ...
    YieldExpression

YieldExpression:
    "yield" ("*"? AssignmentExpression)?

如果在非生成器函数中出现 yield 或 yield* 表达式,则会引发早期错误。

还要检查MDN什么是生成器?

于 2014-04-25T05:56:57.443 回答