◆ イテレータを返すような forEach をつくる
◆ for of などの関数スコープでないものを使う
◆ map で配列を返して それに yield* 

function *gen(arr){
arr.forEach(function*(e){
yield e*e*e
})
}

こんな感じのことがしたいんです
↑は動いて欲しいとおりには動きません

配列をループで使用していて その中で yield を使いたいです
普通にやるならこれ
function *gen(arr){
for(const e of arr){
yield e*e*e
}
}

forEach が使える状態で普通の for 文は極力書かないようにしたいですし それと同じで 構文の for of はあまり使いたくないです

ですが forEach で関数を呼び出すともう yield はつかえなくなります
やる方法は forEach がイテレータを返すようにして yield* を使うことになります

ということで
Array.prototype.gForEach = function*(fn){
for(let i=0;i<this.length;i++)
yield* fn(this[i], i, this)
}

を準備して
function *gen(arr){
yield* arr.gForEach(function*(e){
yield e*e*e
})
}
console.log([...gen([1,2,3])])
[1, 8, 27]

動いてますね

for 書きたくないと言いつつかいてますが ライブラリ部分はめったに書くものではないですしパフォーマンスの都合もあるので仕方なく for を書いてます


ところで ひとつめを yield するタイミングで全部の結果が決まっていても良い場合はこれで おっけいです
function *gen(arr){
yield* arr.map(e => e*e*e)
}

配列がとても大きいとか forEach 部分を実行するタイミングで結果が変わる場合は向いていません