我是Javascript的新手,并注意到语句有值:
> x = 1
<- 1
> if (false) {
x=1;
}
else { x=2 };
<- 2
有人可以解释为什么语句具有它们在实际应用程序中使用的值,因为函数需要通过return
显式返回值。
这与完成的概念有关,它与价值相关,不论其类型(正常还是突然)?
答案 0 :(得分:5)
正常完成值主要通过eval
出现在用户代码中,尽管如此,它并不常见。 eval
的返回值是已执行语句的最终完成值。由于eval
执行语句列表,例如当你运行eval("4") === 4
时,你没有专门评估一个值的表达式,自动分号插入正在进行,所以你实际上正在运行eval("4;")
然后获取该语句的完成值。
将来,完成 - 值语义也可能影响the do
expression proposal,这将允许像
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
的正常完成。
执行时(从spec的角度来看),到达函数本身的末尾,它会说“这是一个返回/抛出,如果是这样,将它传播给函数的调用者。如果是正常完成,它只会丢弃该值并返回undefined
。
实际上,存在完成值的事实与具有返回值或抛出异常值完全相同,从规范的角度来看,它恰好在大多数情况下丢弃该值,如果它是非突然完成。