The meaning of “'x' is not a function or its return value is not iterable” error

被刻印的时光 ゝ 提交于 2021-01-20 04:16:00

问题


I accidentally witnessed that this causes an error in V8 (Chrome, Node.js, etc):

for (let val of Symbol()) { /*...*/ }

TypeError: Symbol is not a function or its return value is not iterable

It appears that any other non-iterable value (including a function) causes another error:

for (let val of function () { throw 'never called' }) { /*...*/ }

TypeError: (intermediate value) is not iterable

As the reference states, the error is specific to Chrome:

TypeError: 'x' is not a function or its return value is not iterable (Chrome)

...

The value which is given as the right hand-side of for…of or as argument of a function such as Promise.all or TypedArray.from, is not an iterable object. An iterable can be a built-in iterable type such as Array, String or Map, a generator result, or an object implementing the iterable protocol.

It seems that none of listed things are expected to accept a function instead of iterable as an argument so it's unclear why the error puts emphasis on function type.

Is there any meaning to this error? Are there circumstances under which is not a function remark makes sense in its context?


回答1:


Yes, there is meaning to both parts of the error message. In the case you have at hand, the return value of Symbol() is not iterable, so that's the second option. As an example for the first option, just take something that's not a function:

let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}

gives: Uncaught TypeError: NotAFunction is not a function or its return value is not iterable. In this case, clearly, NotAFunction is not a function ;-)

I don't know why there aren't two separate error messages for "it's not a function at all" and "it was a function and it's been called, but its return type wasn't iterable". Presumably something in the internal logic to implement for..of loops made it prohibitively complicated to have finer-grained error reporting -- so the combined error message simply mentions two possible reasons why the loop didn't work.



来源:https://stackoverflow.com/questions/61772822/the-meaning-of-x-is-not-a-function-or-its-return-value-is-not-iterable-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!