classCounter { constructor(limit) { this.limit = limit; } [Symbol.iterator]() { let count = 1, limit = this.limit; return { next() { if (count <= limit) { return { done: false, value: count++ }; } else { return { done: true }; } }, return() { console.log('Exiting early'); return { done: true }; } }; } } let counter1 = newCounter(5); for (let i of counter1) { if (i > 2) { break; } console.log(i); } // 1 // 2 // Exiting early let counter2 = newCounter(5); try { for (let i of counter2) { if (i > 2) { throw'err'; } console.log(i); } } catch(e) {} // 1 // 2 // Exiting early let counter3 = newCounter(5); let [a, b] = counter3; // Exiting early
如果迭代器没有关闭,则还可以继续从上次离开的地方继续迭代。比如,数组的迭代器就是不能关闭的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
let a = [1, 2, 3, 4, 5]; let iter = a[Symbol.iterator](); for (let i of iter) { console.log(i); if (i > 2) { break } } // 1 // 2 // 3 for (let i of iter) { console.log(i); } // 4 // 5
let a = [1, 2, 3, 4, 5]; let iter = a[Symbol.iterator](); iter.return = function() { console.log('Exiting early'); return { done: true }; }; for (let i of iter) { console.log(i); if (i > 2) { break } } // 1 // 2 // 3 // 提前退出 for (let i of iter) { console.log(i); } // 4 // 5