云烟成雨 发表于 2022-7-29 21:13

关于js里Generator函数yield*的疑问

本帖最后由 云烟成雨 于 2022-8-1 10:27 编辑

https://www.runoob.com/w3cnote/es6-generator.html


Generator函数,菜鸟上面yield* 表达式的示例会报错,那个等同于会报错,而且那个next的值为什么会传到第二个函数里,有点不理解,
谁能解释一下,并修复一下那个等同于那里的bug?


具体代码如下:
function* callee() {
    console.log('callee: ' + (yield));
}

// 等同于
function* caller() {
    while (true) {
      for (var value of callee) {
            yield value;
      }
    }
}

const callerObj = caller();
callerObj.next();
callerObj.next("a");
callerObj.next("b");

报错:Uncaught TypeError: callee is not iterable
改成callee()后不报错了,但是next的值无法传递过去了,他这个等同于好像并没有完全等同,还有什么等同的方法吗?

hulan 发表于 2022-7-29 21:49

测试没有报错,你那边报什么错?

d199212 发表于 2022-7-30 08:18

报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行

云烟成雨 发表于 2022-7-30 11:32

d199212 发表于 2022-7-30 08:18
报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行

搬过去了的,不是报未定义,是报的非迭代对象

云烟成雨 发表于 2022-7-30 11:36

hulan 发表于 2022-7-29 21:49
测试没有报错,你那边报什么错?

那是因为你就没替换啊,上面说等同于,就是说那个函数要替换上去的,你直接复制源代码没报错是因为下面那个函数根本就没运行啊,你要替换上去才行,不然只定义未运行。我刚把代码贴上去了

云烟成雨 发表于 2022-7-30 11:37

d199212 发表于 2022-7-30 08:18
报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行

我刚把代码贴上去了,你看一下

boxer 发表于 2022-7-30 12:17

Generator函数本身并不是可迭代对象, 它是用来生成可迭代对象的, 也就是你需要调用它
等同于 是说相当于那样的执行机理,并不是完全等价, for in只是遍历里面的数据并没有输入参数给他,因此无法完全等价, 也就是无法像上面那样通过next传入参数给它

wzh123456789 发表于 2022-7-30 13:47

如果你知道携程那你应该就明白了

npc404 发表于 2022-7-30 15:39

看报错信息啊,明显是for (var value of callee)这行代码里callee错了,没有调用,要调用才会返回一个迭代器

unmask 发表于 2022-7-31 09:32

line8:for (var value of callee) {
callee后面需要加(),让callee返回iterable对象。
页: [1] 2
查看完整版本: 关于js里Generator函数yield*的疑问