今天我完全碰到了这个问题:Uncaught TypeError: (intermediate value)(...) is not a function
所以是的,在适当的位置放置分号后,它不再抛出该错误。但是,我从来不知道javascript (intermediate value)
中有这样一个概念。
显然,您可以使用以下代码生成该错误的类似变体:
[myFunc] = function(someVar){
console.log(someVar);
return 7;
}();
//error thrown: (intermediate value) is not a function or its return value is not iterable

如果您为该功能命名,则不再intermediate
:
function hi(){return undefined}
[a] = hi();
// error thrown: hi is not a function or its return value is not iterable

我理解它指的是中间的东西,但在这种情况下我们有一个匿名函数,there are ways to determine if a function is anonymous,所以错误信息可能更加明确。
正在搜索the js mozilla mdn我发现this page谈到Array.from
,其中"中间数组"的概念可以找到:
更清楚的是,
Array.from(obj, mapFn, thisArg)
与Array.from(obj).map(mapFn, thisArg)
的结果相同,只是它没有创建中间数组。
但除了这里和那里的信息之外,还不清楚中间值是什么。
这是否有官方定义?
答案 0 :(得分:11)
“中间值”只是在表达式内生成的值,该表达式不是表达式的最终值。在a = (b * c) + d
中,b * c
的结果是右侧表达式中的中间值。
是的,在这种特定情况下,错误消息可能会说“(匿名函数)不是函数或其返回值不可迭代”。但是,并非所有中间值都是匿名函数。 V8的实施者只是选择使用通用错误消息。 (SpiderMonkey [在Firefox中]使用相同的术语,但是不同的消息。)
这是否有官方定义?
规范使用术语“中间结果”here,意思与“中间值”基本相同(对我而言):
6.2 ECMAScript规范类型
规范类型对应于在算法中用于描述ECMAScript语言构造和ECMAScript语言类型的语义的元值。规范类型包括参考,列表,完成,属性描述符,词汇环境,环境记录和数据块。规范类型值是规范伪像,其不一定对应于ECMAScript实现中的任何特定实体。 规范类型值可用于描述ECMAScript表达式评估的中间结果,但这些值不能存储为对象的属性或ECMAScript语言变量的值。
(我的重点)
请注意,除了为函数指定名称之外,您的代码示例并不相同。其中一个尝试迭代值7
。其他尝试迭代值undefined
。它与V8的错误消息无关,但它对SpiderMonkey有效。让我们将苹果与苹果进行比较,删除无关联,并声明我们的变量:
"use strict";
var myFunc;
try {
[myFunc] = function(){
return 7;
}();
} catch (e) {
console.error(e.message);
}
try {
[myFunc] = function hi(){
return 7;
}();
} catch (e) {
console.error(e.message);
}
try {
function hi(){
return 7;
}
[myFunc] = hi();
} catch (e) {
console.error(e.message);
}