关于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的值无法传递过去了,他这个等同于好像并没有完全等同,还有什么等同的方法吗? 测试没有报错,你那边报什么错? 报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行 d199212 发表于 2022-7-30 08:18
报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行
搬过去了的,不是报未定义,是报的非迭代对象 hulan 发表于 2022-7-29 21:49
测试没有报错,你那边报什么错?
那是因为你就没替换啊,上面说等同于,就是说那个函数要替换上去的,你直接复制源代码没报错是因为下面那个函数根本就没运行啊,你要替换上去才行,不然只定义未运行。我刚把代码贴上去了 d199212 发表于 2022-7-30 08:18
报 callee is not defined?如果是的话,那你得把最上面的callee函数要一起搬过去才行
我刚把代码贴上去了,你看一下 Generator函数本身并不是可迭代对象, 它是用来生成可迭代对象的, 也就是你需要调用它
等同于 是说相当于那样的执行机理,并不是完全等价, for in只是遍历里面的数据并没有输入参数给他,因此无法完全等价, 也就是无法像上面那样通过next传入参数给它 如果你知道携程那你应该就明白了 看报错信息啊,明显是for (var value of callee)这行代码里callee错了,没有调用,要调用才会返回一个迭代器 line8:for (var value of callee) {
callee后面需要加(),让callee返回iterable对象。
页:
[1]
2