Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是中间值?_Javascript - Fatal编程技术网

Javascript 什么是中间值?

Javascript 什么是中间值?,javascript,Javascript,今天我正好碰到了这个问题: 所以是的,在适当的地方放置分号之后,它不再抛出那个错误。然而,我从来不知道JavaScript(中间值)中有这样一个概念 显然,您可以使用这段代码生成该错误的类似变体: [myFunc]=函数(someVar){ console.log(someVar); 返回7; }(); //抛出错误:(中间值)不是函数或其返回值不可编辑“中间值”只是在表达式内部生成的值,而不是表达式的最终值。在a=(b*c)+d中,b*c的结果是右侧表达式中的中间值 是的,在这种特定情况下,

今天我正好碰到了这个问题:

所以是的,在适当的地方放置分号之后,它不再抛出那个错误。然而,我从来不知道JavaScript
(中间值)
中有这样一个概念

显然,您可以使用这段代码生成该错误的类似变体:

[myFunc]=函数(someVar){
console.log(someVar);
返回7;
}();
//抛出错误:(中间值)不是函数或其返回值不可编辑
“中间值”只是在表达式内部生成的值,而不是表达式的最终值。在
a=(b*c)+d
中,
b*c
的结果是右侧表达式中的中间值

是的,在这种特定情况下,错误消息可能会说“(匿名函数)不是函数或其返回值不可编辑”。不过,并非所有中间值都是匿名函数。V8的实现者只是选择使用一条通用的错误消息。(SpiderMonkey[在Firefox中]使用相同的术语,但消息不同。)

这有官方定义吗

本规范使用术语“中间结果”来表示与“中间值”基本相同的内容(在我看来):

6.2 ECMAScript规范类型

规范类型对应于算法中用于描述ECMAScript语言结构和ECMAScript语言类型语义的元值。规范类型包括引用、列表、完成、属性描述符、词汇环境、环境记录和数据块。规范类型值是规范人工制品,不一定对应于ECMAScript实现中的任何特定实体规范类型值可用于描述ECMAScript表达式求值的中间结果,但此类值不能存储为对象的属性或ECMAScript语言变量的值

(我的重点)


请注意,除了给函数起一个名称外,您的代码示例并不相同。其中一个尝试迭代值
7
。另一个尝试迭代未定义的值
。这与来自V8的错误消息无关,但对SpiderMonkey来说确实如此。让我们将Apple与Apple进行比较,删除不相关项,并声明变量:

“严格使用”;
var myFunc;
试一试{
[myFunc]=函数(){
返回7;
}();
}捕获(e){
控制台错误(e.message);
}
试一试{
[myFunc]=函数hi(){
返回7;
}();
}捕获(e){
控制台错误(e.message);
}
试一试{
函数hi(){
返回7;
}
[myFunc]=hi();
}捕获(e){
控制台错误(e.message);

}
如果提供与第一个示例相同的返回值,则在第二个示例中会出现相同的错误。您将其更改为未定义的
。值
7
对于解构赋值无效。@CrazyTrain:是的。在Chrome上,除了
(中间值)
hi
(上面代码段中的注释中所示的错误)之外,您还会遇到相同的错误。但是在SpiderMonkey中,
未定义的
确实让它使用了一个完全不同的错误消息。@T.J.Crowder:我正准备在下面问你这个问题。起初我以为未定义的
没有出错,但现在我看到它只是更改了消息。你可能会认为JS在显示该错误消息时会确切知道“中间值”是什么…@Adelin-我还没有实现高度优化的JavaScript引擎,所以我不知道。:-)@Adelin早在60年代初,人工智能领域刚刚起步,该领域的人们已经开始“你会认为5年后,我们就会拥有智能计算机”。半个世纪后,我们甚至比当时的期望更进一步。事实证明,当你真正开始研究计算机科学时,有些东西是很难做到的。(检查alt文本)。说真的,由于执行顺序明确,并且表达式的每个部分都一次计算一个,我发现甚至存在这样的错误都很奇怪。我仍然不明白为什么我不在那里看到
未定义的
,而不是
中间值
,你在假设很多。JavaScript并不是逐行计算所有内容。它将预处理一个脚本,然后开始执行它。您的
var num=7
实际上包括三个步骤来执行该行。它被定义,因此
num
作为一个概念存在,然后它被初始化,以便可以使用,最后它被分配值
7
。如果理论上在定义后但在初始化之前有
num>10
,您也会收到一条错误消息,它可能会说
num不是一个数字(它甚至不是
未定义的
或不大于10
-它不是。