我很好奇为什么:
(function () { return 'one' })()()
返回:
TypeError: (intermediate value)(...) is not a function
而不是:
TypeError: 'one' is not a function
答案 0 :(得分:2)
错误消息使用变量名称或其他标识来表示什么不是函数。由于返回值尚未分配给任何内容,因此它没有标识符,因此引擎会显示select turbine name,
count(if(turbine_name = 'SWSMHD-SC1-RWE01-G112', 1, NULL)) as turbine_count,
from scada_data
where
local_tm BETWEEN '2017-11-01' AND '2017-11-01'
and turbine_name in
(
SELECT
uniqueid
FROM
wind_turbine
WHERE
pooling_station = 20
);
答案 1 :(得分:2)
documentation of the error message "TypeError: "x" is not a function"解释说:
出了什么问题?
它试图从函数中调用一个值,但该值实际上不是一个函数。有些代码希望你提供一个函数,但这没有发生。
它还提供了一些代码示例,可以触发此错误以及它们报告的实际错误消息。我不会在这里复制它们,但请仔细查看它们并注意它们生成的错误消息。
“x”部分在实际错误消息中被预期为函数的对象名称替换而不是。
因为在这种情况下对象没有名称(它是在表达式评估期间计算的中间结果,请参见下面的说明),引擎无法报告其名称并尝试尽可能有用。它报告“(中间值)(...)”可能是因为这种方式更具描述性;它是由函数返回的值,该函数未存储但用于计算另一个值。
它无法报告实际值,因为中间值可以是任何值;如果它是一个复杂的数据结构,则错误消息会变得臃肿,而不会添加太多信息。
显然我从第一次就不明白这个问题,接下来的是我的初步答案,它解释了为什么会产生错误,而不是为什么错误信息是什么而不是OP所期望的。
此代码......
(function () { return 'one' })()()
...创建一个匿名函数......
function () { return 'one' }
...称之为......
(function () { return 'one' })()
...然后尝试将函数返回的值解释为另一个函数并调用它:
(function () { return 'one' })()()
在步骤#1中创建的函数在调用时返回一个字符串('one'
)(步骤2)。
在步骤3中,代码的效果与调用'one'()
相同。这与one()
(您可能认为)不同。
错误消息中引用的中间值是第一个函数调用返回的字符串,然后在表达式中使用(作为函数)而不保存在变量中(这是对“中间”措辞的解释)。
正如错误消息明确指出的那样,'one'
不是一个函数,并且试图将它用作函数(通过在表达式中放置第二对括号)不起作用。
为了使其工作,在步骤#1中创建的匿名函数必须返回另一个(匿名)函数,如下所示:
(function() { return function() { return 'one'; } })()()
现在,当调用它时,外部函数返回一个匿名函数,该函数与原始代码在步骤#1中创建的匿名函数类似。调用此函数时(第二个()
),它将返回字符串'one'
。
这可能不是你想要的。只有使用最好避免的语言功能eval()
才能调用名称为字符串的函数(出于几个强有力的原因。)
答案 2 :(得分:0)
因为在大括号()
中,它(function () { return 'one' }
)变成表达式,产生中间结果,而那些结果尚未绑定到变量
根据spec,
规范类型值是没有的规范工件 必须对应于ECMAScript中的任何特定实体 实现。
规范类型值可用于描述中间结果 ECMAScript表达式评估,但不能存储这些值 作为对象的属性或ECMAScript语言变量的值。