2017-09-21 137 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!=語句,並且有很多語言不使用'{}'' –