鍍金池/ 問答/Java  網(wǎng)絡(luò)安全  HTML/ es6 生成器函數(shù)里面 yield *this.items.keys(); 中的

es6 生成器函數(shù)里面 yield *this.items.keys(); 中的 *this 什么作用

深入理解es6 p146,看到一串代碼:
代碼前的引言:

既然生成器方法很有用,那么在表示集合的自定義類中定義一個默認迭代器,那就更好。你可以使用 Symbol.iterator 來定義生成器方法,從而定義出類的默認迭代器,就像這樣:
class Collection {
    constructor() {
            this.items = [];
        }
        *[Symbol.iterator]() {
            yield *this.items.keys();
        }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(3);
collection.items.push(2);

for (let x of collection) {
    console.log(x);
}

全書 *this 用法只此一處,這個地方我不明白,這是什么用法?我測試了下, *this 的代碼可以這樣替換:

class Collection {
    constructor() {
            this.items = [];
        }
        *[Symbol.iterator]() {
            for (let item of this.items.keys()) {
                yield item;
            }
        }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(3);
collection.items.push(2);

for (let x of collection) {
    console.log(x);
}

如果* this 代碼不改,換一種實現(xiàn)方式也可以

class Collection {
    constructor() {
            this.items = [];
        }
        *[Symbol.iterator]() {
            yield *this.items.keys();
        }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(3);
collection.items.push(2);

/*for (let x of collection) {
    console.log(x);
}*/

for (let x of collection.items.keys()) {
    console.log(x);
}

但是我始終不能理解這個用法是為什么,因為我覺得沒有 * 也是可以的,但是實際上測試沒有 * 就不對了,于是我就猜測,難道這里是這么個意思?把 this.items.keys 當成生成器函數(shù)?但是覺得不合理

class Collection {
    constructor() {
            this.items = [];
        }
        *[Symbol.iterator]() {
            yield *(this.items.keys)();
        }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(3);
collection.items.push(2);

for (let x of collection) {
    console.log(x);
}

所以有人知道這里的 *this 到底是什么邏輯么?
書上這么解釋的

此例為生成器方法使用了一個需計算名稱,并將此方法委托到 this.items 數(shù)組的 keys()
迭代器上。任意管理集合的類都包含一個默認迭代器,這是因為一些集合專用的操作都要求
目標集合具有迭代器。現(xiàn)在, Collection 的任意實例都可以在 for-of 循環(huán)內(nèi)被直接使
用,也能配合擴展運算符使用。
回答
編輯回答
檸檬藍

yield *是一個表達式,是用來在一個生成器函數(shù)里執(zhí)行另一個生成器函數(shù)的。

以你第一個代碼為例:

class Collection {
    constructor() {
            this.items = [];
        }
        *[Symbol.iterator]() {
            yield *this.items.keys();
        }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(3);
collection.items.push(2);

for (let x of collection) {
    console.log(x);
}

for (let x of collection) {}
等價于
for (let x of collection.[Symbol.iterator]()) {}
等價于
for (let x of collection.items.keys()) {}

貼個詳細地址

2017年8月2日 09:32