我正在研究javascript ES6的生成器。
虽然我试图理解我的书的一个例子,但由于下面的代码中没有逗号的数组,我遇到了麻烦。
此代码如何运作?
[code]
let gen = function*(){
return [yield yield]; // how this code line works?
}
let genObj = gen();
console.log(genObj.next());
console.log(genObj.next(10));
console.log(genObj.next(20));
[运行结果]
Object {value: undefined, done: false}
Object {value: 10, done: false}
Object {value: Array[1], done: true}
[test - 1]
let gen = function*(){
return ['a' 'b'];
}
// Uncaught SyntaxError: Unexpected string
[test - 2]
let a = [yield yield]
// Uncaught SyntaxError: Unexpected identifier
答案 0 :(得分:6)
我将专注于你的第一个例子:
return [yield yield];
此行从右到左运行。最右侧yield
向iterator的调用者发送value
undefined
(这是genObj
是一个迭代器)。在您调用genObj.next(10)
的行上,您将10
传递到函数gen()
并在最右侧yield
恢复执行,就好像{{1}变成yield
:
10
现在,控制台会记录return [yield 10];
,因为那是您10
的下一个value
。然后你传入yield
所以实际上函数恢复如下:
20
所以记录的最后一次返回return [20];
是一个包含值value
的{{1}}数组。
答案 1 :(得分:4)
您的代码等同于以下内容:
let gen = function*(){
let x = yield;
let y = yield x;
return [y];
}
let genObj = gen();
console.log(genObj.next());
console.log(genObj.next(10));
console.log(genObj.next(20));

[yield yield]
不是元素之间没有逗号的数组,它是单个元素的数组,表达式yield yield
。
yield yield
首先评估右yield
。它没有参数,因此从第一次调用undefined
返回.next()
。第二个.next()
传递10
,其成为yield
的结果值。
此10
传递给第二个yield
,显示为第二个.next()
调用的返回值。第三个.next()
调用通过了20
,这将成为第二个yield
的结果值。
然后,该函数将此20
包装在数组[
]
中并返回。