3

我是 Javascript 新手,并注意到语句具有值:

> x = 1
<- 1

> if (false) {
    x=1;
  } 
  else { x=2 };
<- 2

有人可以解释为什么语句具有它们在实际应用程序中使用的值,因为函数需要通过return.

这是否与完成的概念有关,完成的概念与值相关,无论其类型如何(正常或突然)?

4

1 回答 1

5

正常的完成值主要出现在用户代码中eval,尽管即使这样也不是很常见。的返回值eval是执行语句的最终完成值。由于eval执行语句列表,eval("4") === 4例如,当您运行时,您不会专门为某个值评估表达式,自动分号插入正在启动,因此您实际上是在运行eval("4;"),然后获取该语句的完成值。

将来,完成值语义也可能会影响表达式提案,这将允许类似的代码do

const value = do {
  if (false) {
    1;
  } else { 
    2;
  }
};

value === 2;

您几乎可以将您的示例视为语言中一般完成值语义的一个很好的副作用。当您throwreturn来自一个函数时,例如规范语言本身仍然遍历整个函数。Returning 或 throwing 本质上说“完成值就是这个值”,类型为“return”或“throw”。所以如果你有

function fn()
  if (false) {
    return 1;
  } else { 
    2;
  } 
}

"if" 的一个分支产生一个带有 value 的突然完成,1另一个产生一个带有 value 的正常完成2

当执行(从规范的角度来看),到达函数本身的末尾时,它会说“这是一个返回/抛出,如果是的话,将它传播给函数的调用者。如果它是一个正常的完成,它将只需丢弃该值并返回undefined

所以真的,有一个完成值的事实与有一个返回值或抛出一个异常值完全一样,从规范的角度来看,如果它是一个非突然的值,它在大多数情况下只是碰巧丢弃了这个值完成。

于 2018-05-03T17:32:22.070 回答