er0*_*er0 3 javascript ecma ecmascript-5 ecmascript-6
我是Javascript的新手,并注意到语句有值:
> x = 1
<- 1
> if (false) {
x=1;
}
else { x=2 };
<- 2
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么语句具有它们在实际应用程序中使用的值,因为函数需要通过显式返回值return
.
这与完成的概念有关,它与价值相关,不论其类型(正常还是突然)?
正常完成值主要出现在用户代码中eval
,尽管即使这样也不是很常见.返回值eval
是已执行语句的最终完成值.因为eval
执行一个语句列表,当你运行时eval("4") === 4
,你没有专门评估一个值的表达式,自动分号插入正在进行,所以你实际上正在运行eval("4;")
,然后获得该语句的完成值.
在未来,完成值语义也可能会影响该do
表达建议这将允许这样的代码
const value = do {
if (false) {
1;
} else {
2;
}
};
value === 2;
Run Code Online (Sandbox Code Playgroud)
您几乎可以将您的示例视为语言中一般完成值语义的一个很好的副作用.当您throw
或return
来自函数时,例如spec语言本身仍然遍历整个函数.返回或抛出基本上说"完成值是这个值",类型为"return"或"throw".所以,如果你有
function fn()
if (false) {
return 1;
} else {
2;
}
}
Run Code Online (Sandbox Code Playgroud)
"if"的一个分支产生一个带有值的突然完成,另一个分支产生一个带有值1
的正常完成2
.
当执行时(从spec的角度来看),到达函数本身的末尾,它会说"这是一个返回/抛出,如果是这样,将它传播给函数的调用者.如果它是正常完成,它将只是丢弃价值并返回undefined
.
实际上,存在完成值的事实与具有返回值或抛出异常值完全相同,从规范的角度来看,它恰好在大多数情况下丢弃该值,如果它是非突然的完成.