与块语句混淆

时间:2017-09-21 16:24:32

标签: javascript if-statement control-flow

Noob问题

我正在浏览ES6功能网站,我找到了这段代码



function f (x, y, z) {
    if (y === undefined)
        y = 7;
    if (z === undefined)
        z = 42;
    return x + y + z;
};
alert(f(1))




当我没有将y ans z params传递给函数时,第4行if (z === undefined)为真。我不明白的是,编译器如何知道只有第5行是if块的一部分而不是return语句。

换句话说,编译器如何知道以这种方式执行它

if (z === undefined) {
    z = 42;
}
return x + y + z;

而不是这样

if (z === undefined) {
    z = 42;
    return x + y + z;
}

编译器如何知道return语句不是第二个if语句的一部分?

2 个答案:

答案 0 :(得分:4)

如果省略大括号,则只运行条件后面的单个语句。 z = 42;是遵循该条件的单个语句,因此它是唯一运行的语句。

如果您需要运行多个语句,请将它们包装在一个块中。

应该注意的是,这并不是特定于ES6,甚至是Javascript。使用if语句和块的大多数值得注意的语言遵循这个"规则"。

还应该注意,省略括号通常是个坏主意,除非你有充分的理由和用例。当代码被假定为块的一部分时,它通常会导致这种情况,而实际上并非如此。 Even Apple was bitten by this bad habit.

答案 1 :(得分:0)

从大多数语言中可以看出,您可以用这种方式编写代码。这意味着如果在if / while等之后没有括号,则只执行第一个语句。否则,一切都在括号中。这可能会导致你的代码产生误解,所以即使只有一个声明,也要使用括号(可能将来会有两个或更多声明,良好做法)。