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
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
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- IE8开发人员工具教程(二)
- 在flex中执行一个javascript方法的简单方式
- Flex结合JavaScript读取本地路径的方法
- PowerShell中执行Javascript的方法示例
- javascript asp教程第六课-- response方法
- javascript asp教程More About Recordsets
- javascript asp教程第十二课---session对象
- javascript asp教程创建数据库连接