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

javascript生成器函数function generator初探和理解

2015-09-10 21:30 387 查看
1.介绍

Function generator是ECMA 2015的新规范和技术, 名字略奇怪,然而用法也更骚更奇怪。 有两种方式编写一个生成器函数:

  

  1 通过一个Constructor创建一个generator

var GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor
var g = new GeneratorFunction("a", "yield a * 2");var iterator = g(10);
console.log(iterator.next().value); // 20

  2 通过 function* 表达式:
var x = function*(y) {
yield y * y;};


2. 用法和理解
   传统函数有所谓的“run to completion”的特性,即一次运行直至完成。 这意味着这段js代码一旦执行其他代码段不能再运行。 因为我们知道js是单线程的,对于一个cmd执行指令来讲。对于callback函数泛滥的js来讲这是可怕的。

  setTimeout(function(){
console.log("Hello World");},1);

function foo() {
// NOTE: don't ever do crazy long-running loops like this
for (var i=0; i<=1E10; i++) {
console.log(i);
}}

foo();// 0..1E10// "Hello World"


例如,以上代码foo()循环一旦运行就会消耗不少时间,而console.log(..)语句不能中断循环的执行。

正因如此生成器函数带来了新的特性,所谓Run..stop..Run,即一个函数有可能在其执行的中间被中断一次或多次,再继续执行。这允许了其他代码段在某个函数中间执行。听上去,很像多线程的特性,即函数生成器创造了 让一个js进程中,两个相对独立的代码段交替执行,互相通信的功能。在生成器函数内部通过yield表达式来中断函数,并返回一个对象,并在再次进入函数时传递进一个值。

然而生成器本身并不能恢复运行,必须通过外部的控制来重启生成器函数的执行。

以下是一个简单的例子:

function *foo() {
var x = 1 + (yield "foo");
console.log(x);}
其中yield "foo"语句讲返回“foo”对象,并将函数在此暂停返回到函数外部的执行流执行。当函数被重启时,会将传入的值替代yield表达式,即x= 1+ value;

参考资料:

http://davidwalsh.name/es6-generators
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息