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语句的一部分?
答案 0 :(得分:4)
如果省略大括号,则只运行条件后面的单个语句。 z = 42;
是遵循该条件的单个语句,因此它是唯一运行的语句。
如果您需要运行多个语句,请将它们包装在一个块中。
应该注意的是,这并不是特定于ES6,甚至是Javascript。使用if语句和块的大多数值得注意的语言遵循这个"规则"。
还应该注意,省略括号通常是个坏主意,除非你有充分的理由和用例。当代码被假定为块的一部分时,它通常会导致这种情况,而实际上并非如此。 Even Apple was bitten by this bad habit.
答案 1 :(得分:0)
从大多数语言中可以看出,您可以用这种方式编写代码。这意味着如果在if / while等之后没有括号,则只执行第一个语句。否则,一切都在括号中。这可能会导致你的代码产生误解,所以即使只有一个声明,也要使用括号(可能将来会有两个或更多声明,良好做法)。