您的位置:首页 > Web前端 > JavaScript

js-ES6学习笔记-Generator函数

2017-03-06 21:46 183 查看
1、Generator 函数是 ES6 提供的一种异步编程解决方案。形式上,Generator 函数是一个普通函数,但是有两个特征。一是,
function
关键字与函数名之间有一个星号;二是,函数体内部使用
yield
语句,定义不同的内部状态。

2、Generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)。

3、必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用
next
方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个
yield
语句(或
return
语句)为止。换言之,Generator函数是分段执行的,
yield
语句是暂停执行的标记,而
next
方法可以恢复执行。

4、总结一下,调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的
next
方法,就会返回一个有着
value
done
两个属性的对象。
value
属性表示当前的内部状态的值,是
yield
语句后面那个表达式的值;
done
属性是一个布尔值,表示是否遍历结束。

5、一个函数里面,只能执行一次(或者说一个)
return
语句,但是可以执行多次(或者说多个)
yield
语句。正常函数只能返回一个值,因为只能执行一次
return
;Generator函数可以返回一系列的值,因为可以有任意多个
yield


6、由于Generator函数就是遍历器生成函数,因此可以把Generator赋值给对象的
Symbol.iterator
属性,从而使得该对象具有Iterator接口。

var myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};

[...myIterable] // [1, 2, 3]


7、
yield
句本身没有返回值,或者说总是返回
undefined
next
方法可以带一个参数,该参数就会被当作上一个
yield
语句的返回值。

8、下面是一个利用Generator函数和
for...of
循环,实现斐波那契数列的例子。

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

for (let n of fibonacci()) {
if (n > 1000) break;
console.log(n);
}


9、除了
for...of
循环以外,扩展运算符(
...
)、解构赋值和
Array.from
方法内部调用的,都是遍历器接口。这意味着,它们都可以将Generator函数返回的Iterator对象,作为参数。

function* numbers () {
yield 1
yield 2
return 3
yield 4
}

// 扩展运算符
[...numbers()] // [1, 2]

// Array.from 方法
Array.from(numbers()) // [1, 2]

// 解构赋值
let [x, y] = numbers();
x // 1
y // 2

// for...of 循环
for (let n of numbers()) {
console.log(n)
}
// 1
// 2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: