2012-05-15 49 views
0

我可以在任何地方放置一個函數,例如在一個if塊,大小寫塊中。深思熟慮:返回if語句

爲什麼這不起作用:

 (x == "good") ? (return("works")):""; 

更新:我知道我能做到這一點:

 return (x == "good") ? ("works"):""; 

只是想知道爲什麼第一種情況是不能接受的。

+0

「不起作用」 - 你能更精確嗎?什麼是錯誤信息? –

+0

只是一種語言實現選擇。沒有實施以這種方式工作... – Endophage

+1

看看我的答案 - 它解釋了「爲什麼」。 – jmar777

回答

3

這是因爲grammar of a ternary operation is this

條件? expr1:expr2

而且return語句在技術上不被認爲是一個表達式。


編輯:這是一些更多的信息。上面以語言的語法來解釋它,但這裏有一點關於爲什麼的推理。

其實我已經挖成在此之前,因爲我一直認爲它會很酷,能夠做的東西,如:

someFlag && return; 

不是

if (someFlag) return; 

的問題,然而,表達式總是需要評估一些東西。這個要求與return語句的作用不一致,但是,它與(可選地)返回結果一起也會立即終止當前函數的執行。當前函數的終止在邏輯上與評估返回語句本身的值的需要不一致,如果它確實是一個表達式。

假設不一致,語言顯然是作者選擇了不允許return語句作爲表達式。希望我設法以一種合理的方式說出這些話。

+0

@MikeSamuel謝謝。我其實是想說「不是」而不是「是」,但是是的 - 那是被欺騙了。 – jmar777

+0

我想我需要知道更多 – airnet

+0

因爲return語句後沒有分號。這就是爲什麼? – airnet

3

你想做到這一點:

return (x == "good") ? "works":""; 

回報是不是一個函數,所以返回(「工程」)是不正確的。 或者你也可以這樣做:

var x = "bad"; 

var y = (x=="good")? "works" : ""; 

return y; 

但這是更詳細的。所以要回答你的問題,你可以在函數中的任何位置放置返回值,但是在它不會被執行後的任何地方。所以

function x() 
{ 
    var str = ""; 

    return "I love puppies."; 

    str = "me too!" //this won't ever execute, because return exits the function. 
} 

對此的一個例外是變量聲明,因爲變量在開始時會自動聲明,無論放在哪裏。

function y(){ 
    return ""; 

    var x; 
} 

是真的:

function y(){ 
    var x; 

    return ""; 

} 
+0

剛試過你的第二個版本,不起作用,語法錯誤 – airnet

+0

我的不好。改變它顯示稍有不同的東西。 – kemiller2002

2

return關鍵字應該放在第一位:

return (x == "good") ? "works": ""; 

的原因是return x;是一個語句。您不能使用(return x)作爲表達式。

所有的表達式都可以用在需要聲明的地方,但並不是所有的聲明都可以用在需要表達式的地方。

0

你是說如果x是「好」,然後返回,否則不做別的?在這種情況下,

if (x == "good") return "works"; 

有竅門。此外,return不是一個函數,它是一個javascript令牌,因此return不應使用括號。

+0

第二個也不起作用。 – Bergi

+0

啊,應該用回來測試一下。謝謝。 – dangerChihuahua007

0

基於關閉此grammar爲JavaScript的,三元運算符被定義爲:

OrExpression ? AssignmentExpression : AssignmentExpression 

鑑於returnstatement(當然,一個的開始反正)。

在任何情況下,在一個「表現」控制流(讀:「我要聰明一點」)搞亂格式如三元表達式不會被任何人知道我被推薦。 if語句是相同數目的字符:

​​
-1

所有以開頭的答案「迴歸」從我在想什麼打算在他的三元操作OP做不同的行爲。我猜OP希望

x == "good" ? return "works" : ""; 

意味着

if(x == "good") { 
    return works; 
} 
else { 
    ""; //does nothing because the statement ""; has no side effects 
} 

它沒有這樣做,因爲格式是

statement1 ? statement2 : statement3; 

所有的陳述可能有副作用,但只有返回值(在statement1的情況下,只是它的真實性)被三元運算符考慮。

即使? :在「如果」和「那麼」方面最好是閱讀,當思考更接近語法的層次時,應該把它看作一個表達方式,將其納入副作用和返回值中。如果你理解了x ++和++ x之間的區別,你將能夠理解三元運算符。

舉例來說,這裏有一些非法陳述,出於同樣的原因是非法的。

if((return 5) == 5) { 
    //... 
} 

if (loadUserStats(return userId)) == "FAILED") { 
    throw error("oops"); 
} 

x = return y++; 
+2

這是不正確的。如果格式*爲*'statement1? statement2:statement3',那麼提供的代碼將是有效的,因爲return語句是...語句。格式實際上是'條件? expr1:expr2',並且如果返回語句不是表達式,則結果無效。 – jmar777

+0

我的意思是什麼而不是「聲明」? 「表達」?更關心的是強調它不像任何表達式那樣「條件」,因爲像C和Javascript這樣的語言賦予所有對象(原始或不真實)的真實性。如果通過「條件」來表示「只評估其真實性的表達」,那麼確定。 – djechlin

+0

「表達式」和「語句」都在語言的語法中明確定義。給定一個三元操作表達爲條件?表達式:表達式「,該語言將允許任何實際上被認爲是三元運算符內的表達式(真實性在這裏是一個側面問題)。問題在於,在語法上,'return'語句*不被視爲'表達式',因此違反了預期的語法。 – jmar777