2014-03-31 31 views
0

功能FirstFactorial(NUM){什麼時候一個人並不需要在JavaScript中使用 「做」 支架

VAR RVAL = 1;
爲(VAR I = 2;我< = NUM​​;我++)

rval *= i; 

返回RVAL;
}

FirstFactorial(4);

爲什麼上面的功能 - 它計算給定數的階乘 - 不需要「做」支架 - >即,「{}」,放置後它爲了聲明它的工作?我想過(...)之後總是把「{...代碼在這裏執行...}」。

但是,當我嘗試在上面顯示的For語句中添加「{}」時,代碼由於「4 * 2 * 3 *」返回錯誤答案「2」而不是「24」 1「又名」FirstFactorial(4)「。我很困惑。請有人幫助我理解何時在功能中包括括號,何時不必要?

預先感謝您給誰就給誰可以幫助...

+4

之後的一個表達式for?沒有大括號。多個表達式?牙套。但是,如果你總是把它們放在一起,你不必擔心不放它們。 – elclanrs

+1

curlybraces是可選的,但沒有它們,循環上下文會停在下一個分號處。 – adeneo

+0

謝謝你的迅速和有益的答案。我的附加問題,只有當你可以:爲什麼只有當大括號應用於For語句時,上述函數不會返回正確的結果?稱他們爲「可選」似乎是他們應該以任何方式工作;用過與否。但是,當使用大括號時,我返回了「2」,並得到了我的「24」(正確答案),上面沒有使用大括號。 – user3479657

回答

0

你的意見了迴應,但爲了完整性......

一個for statement的規格是:

爲(ExpressionNoInopt; Expressionopt; ExpressionoptStatement

最後的位聲明可以是單個語句或塊中的語句列表。因此,對於:

for (...) { 
    statement_0; 
    statement_1; 
    statement_2; 
} 

所有語句(0到2)將在每次迭代中執行。但沒有大括號(即沒有塊),只執行第一條語句(* statement_0 *)。

for (...) 
    statement_0; 
statement_1; 
statement_2; 

請注意,如果您ommit分號和括號,然後compliler將自行決定分號去,因此報表基於端到端的規則automatic semicolon insertion

0

與許多'大括號'語言一樣,複合語句的主體遵循控制語句,即if (i<n) stmtfor (i=0; i>n; i++) stmt。如果要在循環體中使用多個語句,可以通過在花括號中包含多個語句來實現,以便將語句的集合視爲一個語句。如果你將它們排除在外,它將把下一個語句作爲循環的主體。

與Python或Coffeescript不同的是,Javascript解釋器並沒有注意它是如何縮進的,甚至不管它是在什麼行上(空行被忽略),所以在你的例子中,行rval *= i;是你的循環的主體。如果你把大括號括起來,它應該是一樣的(它對我來說)。

意見不一樣,但我覺得把大括號放進去總是最安全的,但它往往會避免長期存在的問題(例如添加一個與循環體中看起來像是相同的縮進的語句) 「T)。唯一的例外是,當在一條線上做所有事情時有意義,例如:

if (x<0) return; 
相關問題