js-ES6学习笔记-Generator函数
2017-03-06 21:46
183 查看
1、Generator 函数是 ES6 提供的一种异步编程解决方案。形式上,Generator 函数是一个普通函数,但是有两个特征。一是,
2、Generator函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用Generator函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象(Iterator Object)。
3、必须调用遍历器对象的next方法,使得指针移向下一个状态。也就是说,每次调用
4、总结一下,调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后,每次调用遍历器对象的
5、一个函数里面,只能执行一次(或者说一个)
6、由于Generator函数就是遍历器生成函数,因此可以把Generator赋值给对象的
7、
8、下面是一个利用Generator函数和
9、除了
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
相关文章推荐
- js-ES6学习笔记-Generator函数的异步应用
- js-ES6学习笔记-Iterator
- js-ES6学习笔记-Class(2)
- js-ES6学习笔记-Class(4)
- js-ES6学习笔记-正则的扩展
- js-ES6学习笔记-函数的扩展
- js-ES6学习笔记-对象的扩展
- js-ES6学习笔记-字符串的扩展
- js-ES6学习笔记-async函数(3)
- js-ES6学习笔记-Proxy
- js-ES6学习笔记-for...of循环
- js-ES6学习笔记-Class
- js-ES6学习笔记-Class(3)
- js-ES6学习笔记-Class(6)
- js-ES6学习笔记-module(1)
- js-ES6学习笔记-Symbol
- js-ES6学习笔记-Proxy(2)
- js-ES6学习笔记-module(2)
- js-ES6学习笔记-module(4)
- js-ES6学习笔记-Promise对象