2017-09-21 136 views
-2

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参数为函数,在第4行if (z === undefined)为真。我不明白的是,编译器如何知道只有第5行是if块的一部分而不是返回语句。

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

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

,而不是在这样

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

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

+0

如果听起来不太合适,请给出一个合适的标题 –

+0

没有(括号)括号的if语句只会计算单个下一个表达式,计算和返回语句是2个表达式,因此只有计算与“if”链接。这就是为什么你应该总是使用大括号 –

+0

如果没有花括号的块只考虑下一行是要执行的代码块。我很确定这是任何语言中的基本语法规则,它允许if body不被大括号包围。含糊不清的原因也是为什么我讨厌不用围绕着大括号的身体。 – chiliNUT

回答

4

如果省略大括号,则仅运行条件之后的单个语句。 z = 42;是条件之后的单个语句,所以它是唯一运行的语句。

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

应该指出,这不是特定于ES6,甚至不是特定于此问题的Javascript。使用if语句和块的大多数值得注意的语言都遵循这个“规则”。

还应该注意的是,省略大括号通常是一个坏主意,除非你有一个很好的理由和用例。当代码被假定为块的一部分时,通常会导致场景出现,但实际上并非如此。 Even Apple was bitten by this bad habit.

+0

还应该注意的是,依靠这个“功能”通常被认为是不好的形式,因为添加语句很容易,并忘记将它们包装在一个块中。 – glennsl

+0

请注意,这不是一个ES6语法的东西,但始终如此。 C语言的其他语言也是如此,例如Java,C# – gpanagopoulos

0

这是众所周知的大多数语言的概念,您可以用这种方式编写代码。这意味着如果if/while等后面没有大括号,则只执行第一条语句。否则,一切都在大括号中。它可能会导致代码中的误解,所以即使只有一条语句,也可以使用大括号(可能将来会有两条或更多条,这是很好的做法)。

+0

line!=语句,并且有很多语言不使用'{}'' –