有人能解释一下Javascript ECMAScript中语句值的用途吗?

3

我刚接触Javascript,发现语句有值:

> x = 1
<- 1

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

请问有人能解释语句为什么有值,以及它们在实际应用中的作用是什么?因为函数需要通过 return 显式地返回值。

这是否与完成的概念有关,这些完成与值相关,而不考虑它们的类型(正常或异常)?


1
你是在问语句为什么有值,还是为什么会存在正常完成和突然完成? - loganfsmyth
我之前问的是为什么语句有值(以及它们在实际应用中如何使用)。我已经更新了问题以澄清。但我也无法回答第二个问题,所以很想听听(在评论中的)其他人的看法。 - er0
突然完成适用于任何中断代码正常流程的情况,导致后续代码被跳过,例如 returnbreakcontinuethrow。值将是返回的值或抛出的错误。规范中的许多步骤基本上是说“如果这是突然的,请不要执行此代码并将其传递给父级”,而不是运行该代码。 - loganfsmyth
它们的唯一用途是在 eval 和 REPL 中使用。 - Bergi
1个回答

5
正常完成值主要通过eval在用户代码中出现,尽管即使这样也不是非常常见。 eval的返回值是执行语句的最终完成值。由于eval执行一系列语句,因此当您运行例如eval("4") === 4时,您并没有特别地评估一个表达式的值,自动分号插入正在起作用,因此您实际上运行了eval("4;"),然后获取该语句的完成值。
将来,完成值语义还可能影响 do表达式提案,它将允许像以下代码一样的代码
const value = do {
  if (false) {
    1;
  } else { 
    2;
  }
};

value === 2;

你可以将你的示例视为语言中一般完成值语义的一个不错的副作用。例如,当你从函数中 throwreturn 时,规范语言本身仍然遍历整个函数。返回或抛出实际上是说“完成值是这个值”,类型为“return”或“throw”。因此,如果你有
function fn()
  if (false) {
    return 1;
  } else { 
    2;
  } 
}

“if”的一个分支会产生一个值为1的突然完成,另一个分支会产生一个值为2的正常完成。

当执行到函数本身的结尾时(从规范的角度来看),它会说:“这是返回/抛出吗?如果是,则将其传播到函数的调用者。如果它是正常完成,它将仅丢弃该值并返回undefined

因此,实际上,完成值的存在与具有返回值或抛出异常值完全相同,从规范的角度来看,如果它是非突然完成,则大多数情况下会丢弃该值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接