2016-02-20 91 views
3

給定兩個實現相同確切邏輯的JS函數,第一個(test1)將始終返回undefined,而第二個(test2)將返回期望值。實現的區別是一個單一的return語句,vs將評估值存儲在局部變量中,然後返回它。當使用三元語句時,Javascript函數返回undefined

爲什麼test1返回undefined而不是預期的結果?其次,爲什麼把它存儲在一個局部變量(test2)中使它起作用?

這裏是確切的例子:

function test1(a,b) 
{ 
    return 
    a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
} 

function test2(a,b) 
{ 
    var val = 
    a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
    return val; 
} 


alert(test1(1,'abc')); // returns undefined when it should return 2 
alert(test2(1,'abc')); // returns 2 as expected 

這裏是一個的jsfiddle它:https://jsfiddle.net/8gmn004t/1/

+0

我已經證實了在Chrome和邊緣的瀏覽器這種行爲,以及在節點JS –

+1

爲什麼你會想到不同的行爲?它由Javascript語言指定。 – Barmar

回答

4

JavaScript有return後分號插入。你應該在它之後放置一個表達式,以便它可以繼續。 「迴歸」後What are the rules for JavaScript's automatic semicolon insertion (ASI)?

+0

謝謝丹尼爾。我完全不瞭解JS的ASI規則。我想通過壓縮我豪華的換行編碼風格,縮小版已經悄悄地緩解了這個問題。 –

+0

@BobbyKotzev我會建議linting之前縮小。 –

0

在第一種情況下沒有什麼可在同一行評價:

您可以在這裏的規則讀了。在這種情況下,函數返回「undefined」。這是這種語言的工作原理。

試試這個:

function test1(a,b) 
{ 
    return a && a == 1 && b && b.match(/abc/i) ? 
     a + 1 : 
     0; 
}