2013-11-28 70 views
0

以下函數可以工作並執行其預期的工作 - 按指定返回所需的值。JavaScript中不可靠的返回聲明

function returnValue() { 
    return( 
      "value"); 
} 

只是將返回值分割成一個新行。


如果一對圓括號如下所示,那麼它將返回undefined

function returnValue() { 
    return 
     "value"; 
} 

我使用的IDE發出以下警告。

代碼有沒有副作用

這似乎是「價值」是不是return語句本身的一部分。

爲什麼它們的行爲不同?

+0

@Shai:類似的,但很明顯不是重複的。 –

+0

相關:[Javascript的自動分號插入(ASI)的規則是什麼?](http://stackoverflow.com/q/2846283/2074608) –

回答

4

因爲在Javascript中,語句可以用換行符而不是來終止分號。分號基本上自動插入,但只有結果可以是完整的語句

return;是有效的,但然後你的函數沒有返回,你的"value";沒有副作用。

另一方面,你的第一個例子不能這樣解析,因爲行在圓括號的中間結束。

這些規則在ECMA-262標準文檔的§7.9.1中描述。

3

自動分號插入是原因。當要返回的表達式在與return關鍵字分開的一行開始時,會在return語句後插入分號。分號是可選的在許多情況下,但這是不是其中之一

所以

function returnValue() { 
    return 
     "value"; 
} 

最終變爲/被解釋爲

function returnValue() { 
    return; // <- semicolon inserted here 
     "value"; 
} 

導致返回undefined。解決此問題的一種方法是啓動該值以返回與return相同的行。

rules for when automatic semicolon insertion情況,總結

在ECMAScript程序員產生的實用的建議是:

  1. 一個後綴++或 - 操作應該出現在同一行作爲其操作數。
  2. return或throw語句中的表達式應該與return或throw標記在同一行開始。
  3. break或continue語句中的標籤應該與break或continue標記位於同一行。
2

這是因爲JavaScript的自動添加一個分號到返回線的末端,所以在第二個例子中,就好像它只是return;說是本質。