首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“x”的意思不是一个函数,或者它的返回值不可迭代“错误”。

“x”的意思不是一个函数,或者它的返回值不可迭代“错误”。
EN

Stack Overflow用户
提问于 2020-05-13 10:57:18
回答 2查看 20.6K关注 0票数 16

我意外地看到,这会导致V8 (Chrome、Node.js等)出现错误:

代码语言:javascript
复制
for (let val of Symbol()) { /*...*/ }

TypeError:符号不是一个函数,或者它的返回值不可迭代

似乎任何其他不可迭代的值(包括一个函数)都会导致另一个错误:

代码语言:javascript
复制
for (let val of function () { throw 'never called' }) { /*...*/ }

TypeError:(中间值)不可迭代

正如参考文献所述,错误是特定于Chrome的:

TypeError:'x‘不是一个函数,或者它的返回值不可迭代(Chrome) ..。 作为…的右侧给出的值。函数的参数,如Promise.all或TypedArray.from,不是可迭代的对象。迭代可以是内置的可迭代类型,如Array、String或Map、生成器结果或实现可迭代协议的对象。

似乎没有一个列出的东西会被期望接受一个函数而不是一个可迭代的参数,所以不清楚为什么错误会强调函数类型。

这个错误有什么意义吗?在什么情况下,is not a function的评论在其上下文中是有意义的?

EN

回答 2

Stack Overflow用户

发布于 2020-05-13 17:39:38

是的,错误消息的两个部分都有意义。在现有的情况下,Symbol()的返回值是不可迭代的,所以这是第二个选项。作为第一种选择的例子,只需选择一些不是函数的东西:

代码语言:javascript
复制
let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}

给:Uncaught TypeError: NotAFunction is not a function or its return value is not iterable。在这种情况下,显然,NotAFunction不是一个函数;-)

我不知道为什么没有两个单独的错误消息“它根本不是一个函数”和“它是一个函数并且被调用了,但是它的返回类型是不可迭代的”。据推测,实现for..of循环的内部逻辑中的某些东西使得具有更细粒度的错误报告变得非常复杂--因此,合并的错误消息仅仅提到了该循环不能工作的两个可能原因。

票数 5
EN

Stack Overflow用户

发布于 2021-03-16 11:35:29

for..of运算符通过迭代器协议将一个参数传递给变量。

迭代器协议指定了@@ iterator 方法的工作需求,因此,如果函数、对象或类没有实现Symbol.iterator/Symbol.异步iterator,则会抛出此错误。

在第一种情况下,符号它是一个常数,所以它是不可迭代的。在第二种情况下,值是中间值,这意味着VM不能执行到可迭代类型(数组、对象、类或迭代器方法的函数)的转换,也就是说,由于for..of期待@@iterator方法的实现,所以不能执行它来获得结果。

重点在于迭代器是一个具有@@iterator方法的函数。例:

代码语言:javascript
复制
const someIterator = {};
someIterator[Symbol.iterator] = function(names) {
    return {
        next() {
            this.index = 0;
            yield names[index];
            this.index = this.index++;
        }
    }
}

印刷:

代码语言:javascript
复制
{[Symbol.iterator]: [Function (anonymous)]}

for..of循环的预期方法是迭代器函数。因此,错误消息将感同身受,期望一个函数。

要实现该方法,您可以使用ES6类,或使用对象(通过键访问)、原型函数或仅使用生成器来实现上述操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61772822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档