1. 他可以手动调用..., 在you dont know js 里面说过这个 .throw 可以委托异常.
2. 这是由他的语义决定的, 如果他是一个语句, 那他就不能跟表达式连用, 如果他是一个表达式, 那他的返回值又显得有点多余.
3.
```js
function foo4(x = 5) {
return {
next: () => {
return { done: !x, value: x && x-- };
},
"return": () => {
return { done: true, value: '恭喜发财' }
},
"throw": () => {
console.log("THROW!")
}
}
}
let x = new Object;
x[Symbol.iterator] = foo4
aaa: for (let item of x) {
console.log(item, 'w')
for (let item of x) {
console.log(item, 'i')
continue aaa;
}
}
// echo 'return' x2
// 当return 函数返回undefined 的时候会报这个错 Iterator result undefined is not an object
```
被我试出来了, 当return函数返回undefined , 且嵌套循环且continue带有外层循环语句的标签的时候, 他会触发两次return, 缺一个条件都不行. 当return函数返回一个正常的迭代器对象`{done:true, value: 'xxx'}`, 他会输出5个return, 这个return应该由内层的forof 发出, 因为内层的循环直接被打断了, 继续下去的是外层循环, 单层循环不行是因为 continue 的语义并不是打断/结束, 是这样理解么老师, 这里面还有其他的豆子么,老师.
4. 把x展开, 返回迭代值 , 如果 没有 * 返回的将是迭代器函数, .
展开
作者回复: 关于1和3,老实说,这个东西确实灰常灰常麻烦,你得自己去体会tor.return和tor.throw的含义与用法。
我只能提示说:谁创建了tor,那么就该是谁去调用tor.return和tor.throw。这两个方法不是事件触发,而是“tor的持有者”调用。
关于2,你的答案没有对或不对的问题,但我觉得还有深思的余地。不妨多思考一下,不着急有结论。另外,这个问题没有标准答案。
关于4,你“可能”是对的,但似乎表达得不太清楚。^^.