Generator函数用法

一、Generator 函数含义

在Javascript中,一个函数一旦开始执行,就会运行到最后或遇到return时结束,运行期间不会有其它代码能够打断它,也不能从外部再传入值到函数体内。

而Generator函数(生成器)的出现使得打破函数的完整运行成为了可能,其语法行为与传统函数完全不同。

Generator函数是ES6提供的一种异步编程解决方案,形式上也是一个普通函数,但有几个显著的特征:

1.function关键字与函数名之间有一个星号 "*" (推荐紧挨着function关键字)。
2.函数体内使用 yield 表达式,定义不同的内部状态 (可以有多个yield)。
3.直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)。
4.依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态。

// 传统函数
function foo() {
    return 'hello world';
}
foo()   // 'hello world',一旦调用立即执行

// Generator函数
function* gen() {
    yield 'status one';         // yield 表达式是暂停执行的标记  
    return 'hello world';
}
let iterator = gen()         // 调用 Generator函数,函数并没有执行,返回的是一个Iterator对象
iterator.next()              // {value: "status one", done: false},value 表示返回值,done 表示遍历还没有结束
iterator.next()              // {value: "hello world", done: true},value 表示返回值,done 表示遍历结束

上面的代码中可以看到传统函数和Generator函数的运行是完全不同的,传统函数调用后立即执行并输出了返回值;Generator函数则没有执行而是返回一个Iterator对象,并通过调用Iterator对象的next方法来遍历。

二、yield 表达式

1)yield 表达式只能用在 Generator 函数里面,用在其它地方都会报错
2)yield 表达式如果用在另一个表达式中,必须放在圆括号里面
3)yield 表达式用作参数或放在赋值表达式的右边,可以不加括号
4)yield 表达式和return语句的区别

相同:

都能返回紧跟在语句后面的那个表达式的值。

不同:

1.每次遇到 yield,函数就暂停执行,下一次再从该位置继续向后执行;而 return 语句不具备记忆位置的功能。
2.一个函数只能执行一次 return 语句,而在 Generator 函数中可以有任意多个 yield

你可能感兴趣的:(Generator函数用法)