2014-09-10 14 views
0

我發現很難遵循這個return語句的執行流程。如果任何人都可以解釋其執行流程是如何工作的,甚至可以更好地解釋創建如此複雜的語句的優點和缺點,而不是更具可讀性的多行語句,我會非常滿意。解釋下面的複雜JavaScript返回語句的執行流程

return option = option ? option : {}, typeof option.xValue == "boolean" && (_ready = option.xValue), option.name && _ready == !1 && log(option.name + "(" + option.caller + ") API not ready.", "E"), _ready 
+4

明顯的騙局:它很混亂。 – Barmar 2014-09-10 15:46:13

+4

除非你想確定沒有人願意接受你的工作,然後維持你的計劃,否則沒有專業人士。嚴重的是,這是不當行爲。 – 2014-09-10 15:47:07

+0

如果你真的需要做一個聲明(不知道爲什麼,也許你的編輯器打破了,當你在一個函數中打10個語句?),然後至少將它分散在幾個縮進的行,使其可讀。 – 2014-09-10 15:49:35

回答

1

表達式使用逗號操作者來對多個語句,和&&操作者作爲if表達短路操作。

您可以編寫代碼:

if (!option) { 
    option = {}; 
} 
if (typeof option.xValue == "boolean") { 
    _ready = option.xValue; 
} 
if (option.name && _ready == false) { 
    log(option.name + "(" + option.caller + ") API not ready.", "E") 
} 
return _ready; 

寫它作爲一個複雜的表達式的唯一好處是,它是一個複雜的表達式。想要這樣做的原因可能是使代碼難以閱讀,或者可能稍微短一些。

+0

謝謝,那麼||是什麼短路?運營商。我在其他地方發現了這個: me.myfunc(調用者)|| (txt ='「caller」argumant is not alphanumeric。',isOK =!1) – Abtin 2014-09-10 16:06:56

+0

「||」運算符評估第一個操作數,如果它是虛假的,它將計算第二個操作數。你可以這樣寫:if(!me.myfunc(caller)){txt ='「caller」argumant不是字母數字。 isOK = false; }'。 – Guffa 2014-09-10 17:25:31

0

使用operator precedence table以確定表達所有的運營商應該如何進行分組:

return 
    option = 
     option ? option : {}, 
    typeof option.xValue == "boolean" && 
     (_ready = option.xValue), 
    option.name && 
     _ready == !1 && 
      log(option.name + "(" + option.caller + ") API not ready.", "E"), 
    _ready 

逗號操作符分隔每個參數的評估每個表達式,並返回最右邊的一個。所以首先它執行option分配。然後它會評估&&表達式中的每一個,這些表達式可能會分配給_ready或致電log()。然後它最終返回值_ready

我不認爲他實際上需要圍繞_ready任務的括號,他給我們帶來了一塊骨頭。

寫這麼複雜的陳述沒有實際的理由。這樣做的人只是試圖展示他們是多麼聰明,恕我直言。請參閱Guffa的重寫可理解代碼的答案。

+0

謝謝Barmar。你還可以解釋什麼||在這樣的陳述中做了。例如: : 'code' typeof option.xValue ==「boolean」|| (_ready = option.xValue),'code' – Abtin 2014-09-10 16:15:00

+0

「||」運算符從左到右評估其參數,返回第一個真值。所以如果'選擇。xValue'是一個布爾值,它將返回'true'並且不執行'_ready'賦值。如果它不是布爾值,它將執行分配。 – Barmar 2014-09-10 16:23:25

+0

很酷,謝謝Barmar – Abtin 2014-09-10 16:26:47