什么是中间值?

时间:2018-05-14 11:25:10

标签: javascript

今天我完全碰到了这个问题: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)的结果相同,只是它没有创建中间数组

但除了这里和那里的信息之外,还不清楚中间值是什么

这是否有官方定义?

1 个答案:

答案 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);
}