Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “的含义';x';不是函数或其返回值不可iterable“;错误_Javascript_Node.js_Google Chrome_V8_For Of Loop - Fatal编程技术网

Javascript “的含义';x';不是函数或其返回值不可iterable“;错误

Javascript “的含义';x';不是函数或其返回值不可iterable“;错误,javascript,node.js,google-chrome,v8,for-of-loop,Javascript,Node.js,Google Chrome,V8,For Of Loop,我意外地看到,这会导致V8中出现错误(Chrome、Node.js等): TypeError:符号不是函数或其返回值不可编辑 任何其他不可iterable值(包括函数)似乎会导致另一个错误: for (let val of function () { throw 'never called' }) { /*...*/ } TypeError:(中间值)不可编辑 如前所述,该错误特定于Chrome: TypeError:“x”不是函数或其返回值不可编辑(Chrome) 作为函数(如Promis

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

TypeError:符号不是函数或其返回值不可编辑

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

for (let val of function () { throw 'never called' }) { /*...*/ }
TypeError:(中间值)不可编辑

如前所述,该错误特定于Chrome:

TypeError:“x”不是函数或其返回值不可编辑(Chrome)

作为函数(如Promise.all或TypedArray.from)的for…的右侧或作为其参数给出的值不是iterable对象。iterable可以是内置的iterable类型,如数组、字符串或映射、生成器结果或实现iterable协议的对象

似乎所有列出的东西都不希望接受函数而不是iterable作为参数,因此不清楚为什么错误强调函数类型


这个错误有什么意义吗?是否存在
不是函数的情况
备注在上下文中有意义?

是的,错误消息的两个部分都有意义。在您手头的情况下,
Symbol()
的返回值是不可编辑的,因此这是第二个选项。作为第一个选项的示例,仅以非函数的内容为例:

let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}
给出:
未捕获类型错误:NotAFunction不是函数或其返回值不可编辑
。在这种情况下,
notaffunction
显然不是函数;-)


我不知道为什么“它根本不是一个函数”和“它是一个函数,它被调用了,但它的返回类型不可编辑”没有两条单独的错误消息。大概是内部逻辑中实现for..of循环的某些东西使得更细粒度的错误报告变得异常复杂——因此组合的错误消息只提到了循环不工作的两个可能原因。

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

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

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

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


常量someIterator={};
someIterator[Symbol.iterator]=函数(名称){
返回{
下一个(){
该指数=0;
收益率名称[索引];
this.index=this.index++;
}
}
}
印刷:

{[Symbol.iterator]: [Function (anonymous)]}
for..of循环的预期方法是迭代器函数。因此,错误消息将使期望函数的用户产生共鸣


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

要重新创建该错误消息,请尝试
for(let val of(function(){})(){}
-在您的示例中,您没有调用函数。我怀疑这可能是某些建议的残余,该建议允许传递生成器函数,而不是现在只接受迭代器的生成器@谢谢,这确实触发了错误。这与使用函数构造原语有关。JSC的行为类似
for(设数值(1)的val){}
for(设布尔值(true)){}
发出相同的错误
for(让val为1){}
for(让val为true){}
不执行此操作。V8中字符串的实例。但是,我在字符串表中找不到对条目的引用。
[…Symbol()]
将抛出相同的TypeError,移动到此处删除我的答案并继续讨论
{[Symbol.iterator]: [Function (anonymous)]}