我从ecmascript 6
- 生成器函数看了一下新的未来,我对.next()
函数的作用感到有点困惑。
在他们所说的官方文档中,我引用:A zero arguments function that returns an object with two properties:
,根据website(Feb 17, 2015 4:57:46 PM
此处提供的文档链接)<-
更新了相关信息。 p>
所以,假设我们有这个生成器函数:
function* first(){
yield 1;
yield 2;
}
var f= first();
致电f.next()
时会返回{value:1, done:false}
。再次致电时,将返回{value:2, done:true}
但是,如果我们有这样的事情:
function* second() {
var a = yield "HELLO";
console.log("a = ", a);
var b = yield a+ 1;
console.log("b = ", b);
return b
}
var f= second();
当您这样称呼时:f.next()
您将收到{value: "HELLO", done: false}
下一个电话会是f.next(1)
,它会将1分配给a,然后输出{value: 2, done: false}
下一个电话会是f.next(1)
,会输出{value: 1, done: true}
问题
.next()
?value
属性等于1而在第二次调用时它等于2?谢谢!
PS: Of course, there's another usage of generator functions ( to avoid callbacks ), but I'm asking about this particular case.
答案 0 :(得分:2)
- 如果在官方文件中声明它是零参数函数,你可以用参数调用.next()吗?
醇>
参数可以传递给
next
函数,但它们的解释和有效性取决于目标迭代器。for-of
语句和迭代器的其他常见用户不通过任何参数,所以期望以这种方式使用的Iterator对象必须准备好处理没有参数的调用。
因此,将参数传递给next
并不违反ES6规范。在这种情况下,传递给next
的值将分配给您为yield
表达式指定的变量。
- 为什么第3个结果的value属性等于1,第二次调用它等于2?
- 为什么b是1而不是2?
醇>
订单中的操作列表
<强> f.next()
强>
yield "HELLO"
所以你得到{ value: 'HELLO', done: false }
<强> f.next(1)
强>
var a = 1;
console.log("a = ", a);
yield a + 1
这就是您在此次通话中获得{ value: 2, done: false }
的原因。
<强> f.next(1)
强>
var b = 1;
console.log("b = ", b);
return b
这就是你在这里获得{ value: 1, done: true }
的原因。
答案 1 :(得分:1)
使用其他值,它变得更加清晰。它按预期工作。
function* second() {
var a = yield "HELLO";
console.log("a = ", a);
var b = yield a+ 1;
console.log("b = ", b);
return b
}
var f= second();
console.log('1:',f.next());
console.log('2:',f.next(5));
console.log('3:',f.next(7));
输出
///1st next()
//yeld returns iterator
{value: "HELLO", done: false}
//2nd next(5)
//the console log gets executed with var a = 5
a = 5
//yeld returns iterator
{value: 6, done: false}
//3rd next(7)
//the console log gets executed with var b = 7
b = 7
//it doesn't use the 'a' var at all, neither does it add +1 to the yeld allocation
//yeld returns iterator
{value: 7, done: true}