我可以在任何地方放置一個函數,例如在一個if塊,大小寫塊中。深思熟慮:返回if語句
爲什麼這不起作用:
(x == "good") ? (return("works")):"";
更新:我知道我能做到這一點:
return (x == "good") ? ("works"):"";
只是想知道爲什麼第一種情況是不能接受的。
我可以在任何地方放置一個函數,例如在一個if塊,大小寫塊中。深思熟慮:返回if語句
爲什麼這不起作用:
(x == "good") ? (return("works")):"";
更新:我知道我能做到這一點:
return (x == "good") ? ("works"):"";
只是想知道爲什麼第一種情況是不能接受的。
這是因爲grammar of a ternary operation is this:
條件? expr1:expr2
而且return語句在技術上不被認爲是一個表達式。
編輯:這是一些更多的信息。上面以語言的語法來解釋它,但這裏有一點關於爲什麼的推理。
其實我已經挖成在此之前,因爲我一直認爲它會很酷,能夠做的東西,如:
someFlag && return;
不是
if (someFlag) return;
的問題,然而,表達式總是需要評估一些東西。這個要求與return語句的作用不一致,但是,它與(可選地)返回結果一起也會立即終止當前函數的執行。當前函數的終止在邏輯上與評估返回語句本身的值的需要不一致,如果它確實是一個表達式。
假設不一致,語言顯然是作者選擇了不允許return語句作爲表達式。希望我設法以一種合理的方式說出這些話。
你想做到這一點:
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 "";
}
剛試過你的第二個版本,不起作用,語法錯誤 – airnet
我的不好。改變它顯示稍有不同的東西。 – kemiller2002
的return
關鍵字應該放在第一位:
return (x == "good") ? "works": "";
的原因是return x;
是一個語句。您不能使用(return x)
作爲表達式。
所有的表達式都可以用在需要聲明的地方,但並不是所有的聲明都可以用在需要表達式的地方。
你是說如果x是「好」,然後返回,否則不做別的?在這種情況下,
if (x == "good") return "works";
有竅門。此外,return
不是一個函數,它是一個javascript令牌,因此return
不應使用括號。
第二個也不起作用。 – Bergi
啊,應該用回來測試一下。謝謝。 – dangerChihuahua007
的return
keyword標誌着語句的開始。這不是一個表達式,你可以使用ternary operator。
基於關閉此grammar爲JavaScript的,三元運算符被定義爲:
OrExpression ? AssignmentExpression : AssignmentExpression
鑑於return
是statement
(當然,一個的開始反正)。
在任何情況下,在一個「表現」控制流(讀:「我要聰明一點」)搞亂格式如三元表達式不會被任何人知道我被推薦。 if語句是相同數目的字符:
所有以開頭的答案「迴歸」從我在想什麼打算在他的三元操作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++;
這是不正確的。如果格式*爲*'statement1? statement2:statement3',那麼提供的代碼將是有效的,因爲return語句是...語句。格式實際上是'條件? expr1:expr2',並且如果返回語句不是表達式,則結果無效。 – jmar777
我的意思是什麼而不是「聲明」? 「表達」?更關心的是強調它不像任何表達式那樣「條件」,因爲像C和Javascript這樣的語言賦予所有對象(原始或不真實)的真實性。如果通過「條件」來表示「只評估其真實性的表達」,那麼確定。 – djechlin
「表達式」和「語句」都在語言的語法中明確定義。給定一個三元操作表達爲條件?表達式:表達式「,該語言將允許任何實際上被認爲是三元運算符內的表達式(真實性在這裏是一個側面問題)。問題在於,在語法上,'return'語句*不被視爲'表達式',因此違反了預期的語法。 – jmar777
因爲"Almost everything is an expression"還沒有成爲語言呢。
「不起作用」 - 你能更精確嗎?什麼是錯誤信息? –
只是一種語言實現選擇。沒有實施以這種方式工作... – Endophage
看看我的答案 - 它解釋了「爲什麼」。 – jmar777