2016-11-21 48 views
1

javascript是否有奇怪的行爲從三元語句返回值?下面是我寫的,從三元語句返回一個值的應用程序的功能:確實javascript有奇怪的行爲從三元語句返回函數值?

function getFlowAmount(fromRegionName, toRegionName) 
{ 
    return 
     _reportPeriodId === 1 ? 
     mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
     mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 
} 

上面返回undefined即使開發工具的手錶顯示的值應返回,所以我在改寫了函數的函數更加模塊化和冗長的方式是這樣的:

function getFlowAmount(fromRegionName, toRegionName) 
{ 
    var flowAmount = 0; 
    if(_reportPeriodId === 1) flowAmount = mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ]; 
    else flowAmount = mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 
    return flowAmount; 
} 

當我改寫了javascript函數如上圖所示,該功能開始返回預期值。那麼javascript有奇怪的行爲從三元語句返回函數值?或者我在上面的原始函數中做了某種類型的語法或邏輯錯誤?

回答

7

這不是非常直觀,但這與三元操作無關。這全是關於automatic semicolon insertion

雖然表達式本身可以跨越多行,但在JavaScript中,return語句與表達式開始之間不會有新行。所以這個:

return 
    _reportPeriodId === 1 ? 
    mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
    mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 

變成這樣:

return; 
    _reportPeriodId === 1 ? 
    mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
    mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 

和三元操作決不會在第一時間進行評估。

要糾正它,只是開始在同一行的操作:

return _reportPeriodId === 1 ? 
    mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
    mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 
+2

擊敗我們所有人吧XD –

+0

都對此有任何聰明的解決方法?或者JavaScript無條件強迫我把eval表達式放在第一行? – user7066345

+0

@ user7066345:我想你可以試着把表達式放在圓括號中,然後把第一個左括號放在第一行。這應該會啓動表達式而不會嚴重影響代碼格式,並且仍應評估爲相同的結果。 – David

1

這是因爲JavaScript的automatic semicolon insertion,其中對待return爲兩個單獨的語句

function getFlowAmount(fromRegionName, toRegionName) 
{ 
    return; 
    _reportPeriodId === 1 ? 
     mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
     mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 
} 

return語句受自動分號插入(ASI)的影響。 return關鍵字和表達式之間不允許有行結束符。


寫return語句不return keyworkd後立即換行會解決這個問題:

function getFlowAmount(fromRegionName, toRegionName) 
{ 
    return _reportPeriodId === 1 ? 
     mapData[toRegionName + 'Region']['NetFlow' + fromRegionName ] : 
     mapData[toRegionName + 'Region']['NetFlowChange' + fromRegionName]; 
}