连续多次调用函数

时间:2017-11-03 10:16:32

标签: javascript

我很好奇为什么:

(function () { return 'one' })()()

返回:

TypeError: (intermediate value)(...) is not a function 

而不是:

TypeError: 'one' is not a function

3 个答案:

答案 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' })()()
  1. ...创建一个匿名函数......

    function () { return 'one' }
    
  2. ...称之为......

    (function () { return 'one' })()
    
  3. ...然后尝试将函数返回的值解释为另一个函数并调用它:

    (function () { return 'one' })()()
    
  4. 在步骤#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语言变量的值。