今天我正好碰到了这个问题:未知TypeError:(中间值)(.)不是一个函数
所以是的,在适当的地方放置分号,它不再抛出那个错误。然而,我从来不知道在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
我知道它指的是中间的东西,但是在本例中我们有一个匿名函数和有一些方法可以确定函数是否是匿名的。,所以错误消息可能会更明确一些。
在搜索js mozilla mdn时,我发现了谈论Array.from的此页,在那里可以找到“中间数组”的概念:
更明显的是,
Array.from(obj, mapFn, thisArg)的结果与Array.from(obj).map(mapFn, thisArg)相同,只是它不创建中间数组。
但是,除了零星的信息外,还不清楚中间值是什么。
这有官方的定义吗?
发布于 2018-05-14 11:35:58
“中间值”只是一个在表达式中生成的值,而该表达式不是表达式的最终值。在a = (b * c) + d中,b * c的结果是右侧表达式中的中间值.
是的,在这种特殊情况下,错误消息可能会说“(匿名函数)不是函数,或者它的返回值不可迭代”。不过,并不是所有中间值都是匿名函数。V8的实现者只是选择使用一个通用错误消息。(火狐中的SpiderMonkey使用了相同的术语,但消息不同。)
这有官方的定义吗?
该规范使用了“中间结果”( 这里 )一词,在本质上与“中间值”(在我看来)是相同的:
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);
}
https://stackoverflow.com/questions/50329128
复制相似问题