我刚接触Javascript,发现语句有值:
> x = 1
<- 1
> if (false) {
x=1;
}
else { x=2 };
<- 2
请问有人能解释语句为什么有值,以及它们在实际应用中的作用是什么?因为函数需要通过 return
显式地返回值。
这是否与完成的概念有关,这些完成与值相关,而不考虑它们的类型(正常或异常)?
我刚接触Javascript,发现语句有值:
> x = 1
<- 1
> if (false) {
x=1;
}
else { x=2 };
<- 2
请问有人能解释语句为什么有值,以及它们在实际应用中的作用是什么?因为函数需要通过 return
显式地返回值。
这是否与完成的概念有关,这些完成与值相关,而不考虑它们的类型(正常或异常)?
eval
在用户代码中出现,尽管即使这样也不是非常常见。 eval
的返回值是执行语句的最终完成值。由于eval
执行一系列语句,因此当您运行例如eval("4") === 4
时,您并没有特别地评估一个表达式的值,自动分号插入正在起作用,因此您实际上运行了eval("4;")
,然后获取该语句的完成值。const value = do {
if (false) {
1;
} else {
2;
}
};
value === 2;
throw
或 return
时,规范语言本身仍然遍历整个函数。返回或抛出实际上是说“完成值是这个值”,类型为“return”或“throw”。因此,如果你有function fn()
if (false) {
return 1;
} else {
2;
}
}
“if”的一个分支会产生一个值为1
的突然完成,另一个分支会产生一个值为2
的正常完成。
当执行到函数本身的结尾时(从规范的角度来看),它会说:“这是返回/抛出吗?如果是,则将其传播到函数的调用者。如果它是正常完成,它将仅丢弃该值并返回undefined
。
因此,实际上,完成值的存在与具有返回值或抛出异常值完全相同,从规范的角度来看,如果它是非突然完成,则大多数情况下会丢弃该值。
return
、break
、continue
和throw
。值将是返回的值或抛出的错误。规范中的许多步骤基本上是说“如果这是突然的,请不要执行此代码并将其传递给父级”,而不是运行该代码。 - loganfsmytheval
和 REPL 中使用。 - Bergi