Sat*_*rao 3 javascript ecmascript-6
我试图了解如何使用ES6 Generator功能.除了这个关于在传递参数时进行空的next()函数调用的概念时,它似乎非常简单.这是我从Mozilla文档中引用的代码.
function* logGenerator() {
console.log(yield);
console.log(yield);
console.log(yield);
}
var gen = logGenerator();
// the first call of next executes from the start of the function
// until the first yield statement
gen.next();
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaiseRun Code Online (Sandbox Code Playgroud)
根据我的理解,代码只执行到第一个yield语句,所以没有返回任何内容,然后第二次调用next(),代码执行到第二个yield,包括第一个yield行,因此pretzel记录到控制台.
如果是这种情况,在下面提到的代码中如何0登录第一次呼叫next()?我在这里遗漏了一些东西:(
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); // undefinedRun Code Online (Sandbox Code Playgroud)
参考:Mozilla文档
那么,发电机功能有点特殊.它们可以在执行过程中多次接受和返回值,而"普通"函数只能接受一组固定的参数,并返回单个值.在您的第一个示例中,它们用于将数据传递给生成器(多次传递参数),而在第二个示例中则反过来(多次返回值).
考虑这个例子:
function* foo() {
console.log("before a");
var a = (yield 123);
console.log("after a");
yield (a * 2);
console.log("end of function");
}
var bar = foo();
var x = bar.next(); // Runs until the first yield, prints 'before a'.
console.log(x.value); // 123
var y = bar.next(4); // Runs until the second yield, so prints 'after a'.
console.log(y.value); // 8
var z = bar.next(); // prints 'end of function'.
console.log(z.done); // true
Run Code Online (Sandbox Code Playgroud)
我们在第一次next()调用时没有传入数据,让它一直运行到第一个yield语句.由于yield 123call(x.value)的结果是123.下次我们调用next()using 4作为参数值时,我们在a生成器函数内填充局部变量.代码执行到下一个yield语句并返回结果8.
为了解释为什么0而不是1,请参阅另一个答案.
我认为您遇到的是后增量运算符的行为,即index++. 如果您将其更改为预自增运算符,即++index,它将按照您期望的方式运行。
不同之处在于,后自增会在表达式求值index 后加 1 。index预自增会在表达式求值之前加 1 ,我认为这是你的目标。
| 归档时间: |
|
| 查看次数: |
1195 次 |
| 最近记录: |