首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

function*

function*声明(function关键字后跟一个星号)定义了发电机功能,它返回一个Generator对象。

你也可以使用GeneratorFunction构造函数和function* expression来定义生成器函数。

句法

代码语言:javascript
复制
function* name([param[, param[, ... param]]]) {
   statements
}

name函数名称。param要传递给函数的参数的名称。一个函数最多可以有255个参数。statements这些陈述包含了函数的主体。

描述

Generators是可以退出并随后重新输入的功能。他们的上下文(变量绑定)将在重新入口时保存。

调用生成器函数不会立即执行其主体;而是返回该函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数的主体将被执行,直到第一个yield表达式指定要从迭代器返回的值,或者与yield*,委托给另一个生成器函数。该next()方法返回一个对象,该对象的value属性包含已赋值的值以及done指示生成器是否已将其最后值作为布尔值生成的属性。next()使用参数调用该方法将恢复生成器函数的执行,用参数替换yield执行暂停的语句next()

return生成器中的语句在执行时会生成生成器done。如果一个值被return编辑,它将作为返回value。已经返回的发电机不会产生更多的值。

示例

简单的例子

代码语言:javascript
复制
function* idMaker() {
  var index = 0;
  while (index < 3)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
// ...

yield*的示例

代码语言:javascript
复制
function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i) {
  yield i;
  yield* anotherGenerator(i);
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

将参数传递给Generators

代码语言:javascript
复制
function* logGenerator() {
  console.log(yield);
  console.log(yield);
  console.log(yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement
gen.next(); 
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise

生成器中的返回语句

代码语言:javascript
复制
function* yieldAndReturn() {
  yield "Y";
  return "R";
  yield "unreachable";
}

var gen = yieldAndReturn()
console.log(gen.next());?// { value: "Y", done: false }
console.log(gen.next());?// { value: "R", done: true }
console.log(gen.next());?// { value: undefined, done: true }

Generators are not constructable

代码语言:javascript
复制
function* f() {}
var obj = new f; // throws "TypeError: f is not a constructor"

规范

规范

状态

评论

ECMAScript 2015(第6版,ECMA-262)该规范中'函数*'的定义。

标准

初始定义。

ECMAScript 2016(ECMA-262)该规范中'function *'的定义。

标准

改变了生成器不应该有[构造]陷阱,并会在与新的一起使用时抛出。

ECMAScript最新草案(ECMA-262)该规范中'function *'的定义。

生活水平

?

浏览器兼容性

Feature

Chrome

Edge

Firefox (Gecko)

Internet Explorer

Opera

Safari (WebKit)

Basic support

39.0

25 (13.10586)

26.0 (26.0)

No support

26

10

yield*

(Yes)

25 (13.10586)

27.0 (27.0)

No support

26

10

IteratorResult object instead of throwing

(Yes)

25 (13.10586)

29.0 (29.0)

No support

(Yes)

?

Not constructable with new as per ES2016

(Yes)

?

43.0 (43.0)

No support

?

10

Trailing comma in parameters

?

?

52.0 (52.0)

No support

?

?

Feature

Android

Android Webview

Edge

Firefox Mobile (Gecko)

IE Mobile

Opera Mobile

Safari Mobile

Chrome for Android

Basic support

No support

(Yes)

?

26.0 (26.0)

No support

No support

10

39.0

yield*

No support

(Yes)

?

27.0 (27.0)

No support

No support

10

(Yes)

IteratorResult object instead of throwing

No support

?

?

29.0 (29.0)

No support

No support

?

(Yes)

Not constructable with new as per ES2016

?

?

?

43.0 (43.0)

?

?

?

?

Trailing comma in parameters

?

?

?

52.0 (52.0)

?

?

?

?

Firefox-specific notes

Generators and iterators in Firefox versions before 26

较早的Firefox版本实现了较旧版本的生成器提案。在旧版本中,生成器是使用常规function关键字(不带星号)和其他差异来定义的。有关更多信息,请参阅传统生成器函数

IteratorResult 对象返回而不是抛出

从Gecko 29(Firefox 29 / Thunderbird 29 / SeaMonkey 2.26)开始,完整的生成器函数不再抛出TypeError“生成器已经完成”。相反,它会返回一个IteratorResult对象,如{ value: undefined, done: true }bug958951)。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com