ECMAScript 6应该带来生成器函数和迭代器.生成器函数(具有function*语法)返回迭代器.迭代器有一个next方法,当重复调用时,它执行生成器函数的主体,在每个yield操作员处重复暂停和恢复执行.
生成器上的ECMAScript 6 wiki还引入了"委托产量" yield*运算符,如下所示:
该
yield*运营商委托给另一发电机.这为组合生成器提供了方便的机制.
"委托给另一台发电机"是什么意思?我怎样才能yield*"方便地组合发电机"?
[您可以使用--harmony-generators标志在Node v0.11.3中使用生成器.]
这是一项新技术,是ECMAScript 2015(ES6)标准的一部分.该技术的规范已经完成,但请查看兼容性表,了解各种浏览器的使用情况和实现状态.
函数*声明(函数关键字后跟星号)定义了一个生成器函数,它返回一个Generator对象.
您还可以使用GeneratorFunction构造函数和函数*表达式定义生成器函数.
给出的例子:
function* idMaker(){
var index = 0;
while(index < 3)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
// ...
Run Code Online (Sandbox Code Playgroud)
题:
虽然这个例子是可以理解的,但我为什么要在这样的事情上使用它:
var index = 0;
function idMaker(){
return (index < 2) ? index++: undefined;
}
Run Code Online (Sandbox Code Playgroud)
甚至(回答索引范围评论):
var idMaker = function(){
this.index = 0;
this.next = function(){
var res = (this.index < 3) ? this.index++: undefined;
return { value: res };
};
}
var …Run Code Online (Sandbox Code Playgroud) 在Mozilla的页面迭代器和生成器上有一个声明:
虽然自定义迭代器是一个有用的工具,但由于需要显式维护其内部状态,因此需要仔细编程.生成器提供了一个强大的替代方案:它们允许您通过编写可以维持其自身状态的单个函数来定义迭代算法.
关于上述说明,不可能在没有发生器的情况下编写迭代算法,例如:
Array[Symbol.iterator] = function(){
return {
next: function(){
//logic
return {
value: "",
done:false
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
无法理解我的头脑.有人可以解释一下他们创造替代品的主要原因是什么,对我来说似乎并没有什么不同.
我一直在使用Babel一段时间,我很喜欢它.但是,在主页上列出了支持的功能,它说Async functions.
我做了很多谷歌搜索,而我似乎只能理解它是一个ES7功能.
请问什么是ES7异步功能?
对同一问题使用这两种解决方案有什么区别?
const numberIncrementer = startValue => () => startValue++
const getNextNumber = numberIncrementer(0)
console.log(getNextNumber())
// 0
console.log(getNextNumber())
// 1
console.log(getNextNumber())
// 2
Run Code Online (Sandbox Code Playgroud)
const numberIncrementer = function*(startValue) {
while(true) {
yield startValue++
}
}
const numberFactory = numberIncrementer(0)
const getNextNumber = () => numberFactory.next().value
console.log(getNextNumber())
// 0
console.log(getNextNumber())
// 1
console.log(getNextNumber())
// 2
Run Code Online (Sandbox Code Playgroud)
查看这两种方法,我为什么要选择一种方法呢?
使用ES迭代器的充分理由是什么?我知道什么在生成器函数(带*的函数)上用于异步操作。纯迭代器还有哪些其他用例?
请给我一些现实生活中的例子,这与node.js或浏览器的使用无关。