В чем разница между return и return ()?

97
function a() { return 1; }
function b() { return(1); }

Я протестировал приведенный выше код в консоли Chrome, и оба вернулись 1.

function c() { return "1"; }
function d() { return("1"); }

Я также протестировал приведенный выше код, и обе функции вернулись "1".

Так в чем разница между использованием returnи return()?

chris97ong
источник
21
Ответы здесь также будут применимы к void(x),typeof(x)
Пол С.
3
@ PaulS. - всегда озадачивал, void(0)поскольку это должно быть сокращение от undefined . Итак, если это сокращение, зачем включать ненужные символы? ;-)
RobG
1
@RobG Я думаю, что это перенос из Python и может быть действительно полезен для особых случаев, когда вы хотите включить операторы void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Пол С.
1
Возможно, вас позабавит этот вопрос, который относится к вашему вопросу о C #: stackoverflow.com/questions/2186595/…
Эрик Липперт

Ответы:

177

То же, что и между

var i = 1 + 1;

и

var i = (1 + 1);

То есть ничего. Скобки разрешены, потому что они могут влиять на порядок оценки в любом выражении, но в ваших примерах они просто излишни.

returnэто не функция, а инструкция . Он синтаксически похож на другие простые операторы потока управления, такие как breakи continue, в которых также не используются круглые скобки.

РемкоГерлих
источник
12
За оператором возврата может следовать выражение. Возврат должен быть в функции, поэтому функция возвращает значение выражения или, если его нет, undefined .
RobG
37
@ chris97ong: return - это не функция.
RemcoGerlich
34
Если бы вы returnпреобразовали в функцию, как бы вы вернули из нее значение?
dan04
4
Это отличный ответ с отличным примером, но я думаю, что стоит добавить, что return не является функцией в основном ответе, учитывая, что это корень недоразумения, которое привело к этому вопросу.
BiscuitBaker
3
@BiscuitBaker: Я немного добавил. Когда я записал этот короткий ответ, я не ожидал, что он получит 50+ голосов ...
RemcoGerlich
21

Нет никакой разницы.

returnэто не вызов функции, а выражение языка. Все, что вы делаете со скобками, - это просто группируете возвращаемое значение, чтобы его можно было оценить. Например, вы можете написать:

return (x == 0);

В этом случае вы возвращаете значение оператора x == 0, которое вернет логическое значение trueили в falseзависимости от значения x.

альпартис
источник
6
return - это ключевое слово, обозначающее начало оператора return .
RobG
1
Оценка оператора возврата не требует "группировки". Так что в любом случае возврат будет логическим.
Wolf
18

На самом деле здесь приоритет ()выше, поэтому он сначала оценивает:

Здесь сначала ("1")оцениваются следующим образом:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

поэтому приведенное выше утверждение эквивалентно:

return "1";

Визуально увидеть:

визуальный

Таким образом, в принципе нет никакой разницы в функциональности, но второй может быть незначительно медленным, поскольку он сначала решает скобки.

Захир Ахмед
источник
2
Почему вы делаете совершенно непроверенное утверждение, что «второй может быть незначительно медленнее», когда это не так?
9

Абсолютно никакой разницы. Если вы посмотрите на JS (ECMAScript) спецификацию оператора возврата . Среди прочего он сообщает вам:

return [здесь нет LineTerminator] Expression;

что вы можете выразить return. Экспрессия hello, Math.abs(x), yourCustomFunc(7)или в вашем втором случае это может быть 1или (1). Выражение 1после оценки такое же, как (1)и то же самое (((((1))))))или даже как нечто действительно причудливое (+(!(+(!1)))).

Сальвадор Дали
источник
1
+1 за официальную ссылку. Нет ли постраничной ссылки? - Одностраничный HTML загружается очень долго.
Wolf
@Wolf Я таких не нашел. Вот еще одна, но тоже одна страница people.mozilla.org/~jorendorff/…
Сальвадор Дали
Да грустно. Я бы тоже не добился успеха. А как насчет расширения вашей цитаты на весь синтаксис оператора return?
Wolf
9

Разницы нет, скобки необязательны. См. MSDN :

return[(][expression][)];

Необязательный аргумент выражения - это значение, возвращаемое функцией. Если опущено, функция не возвращает значение.

Вы используете оператор return, чтобы остановить выполнение функции и вернуть значение выражения. Если выражение опущено или оператор возврата не выполняется из функции, выражению, вызвавшему текущую функцию, присваивается значение undefined.

Эван Ноулз
источник
8
Только MS может подумать о том, чтобы сделать группировку «необязательной» в операторе возврата . Они так же «необязательны», как и в любом выражении, или во многих других частях грамматики.
RobG
@RobG: Но, судя по всему, их гораздо чаще спрашивают в returnзаявлении. : P MS наверное устал отвечать на вопрос от новичков JS.
cHao
2
Объяснение M $ неверно. Не ()является частью оператора возврата.
Salman A
4
«Есть разница для читателя». Ну да: спецификация MSDN ошибочно подразумевает это return (expressionи return expression)является законной.
Джим Балтер
2
@JimBalter Вместе с return (), return (и return ): P
Пол
9

return- это оператор, ключевое слово, с которого начинается оператор возврата , а не функция.

Как уже упоминалось, дополнительные круглые скобки влияют на порядок оценки, но не используются для «выполнения» названной функции return. Вот почему эти строки работают без проблем:

return (1);
var a = (1);

По сути, они идентичны этим строкам:

return 1;
var a = 1;

Причина, по которой return()возникает синтаксическая ошибка, заключается в точной причине, по которой следующая строка выдает ошибку (для сравнения включен оператор возврата):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error
IQAndreas
источник
И, как примечание, если returnпосле него ничего не указано, предполагается, что вы хотели вернуться undefined.
IQAndreas
@Wolf Выражения не являются обязательными, поэтому returnсамо по себе является оператором возврата.
Пол
6

Есть огромная разница для людей и нулевая разница для движка Javascript.

return 1- это оператор, объявляющий, что нам нужно немедленно выйти из функции, получив значение 1.

return(1)- это то же утверждение, замаскированное под вызов функции по идиотскому соглашению о том, что вы не обязаны вставлять пробел вне скобок в Javascript. Если вы будете использовать такой код в производственной системе, любой сопровождающий придет к вам в офис со ставками и факелами, потратив некоторое время на попытки решить, действительно ли у вас есть return()функция где-то в базе кода или просто вы не знаете, для чего нужно returnключевое слово.

Как уже правильно сказали многие другие, круглые скобки не делают ничего, кроме «группировки» с более высоким приоритетом литерала числа 1.

хиджарский
источник
3
«Для людей огромная разница» - не компетентные. «тот же оператор, замаскированный под вызов функции» - returnфункции нет . «идиотское соглашение о том, что вы не обязаны вставлять пробелы вне скобок в Javascript» - этого почти не требует язык; называть этого идиотом - идиотизм. «любой сопровождающий придет к вам в офис с кольями и факелами» - ни один компетентный не пойдет. return(1)Это плохая практика, но люди, которые расстраиваются из-за таких вещей, тратят ресурсы и создают плохую атмосферу.
Джим Балтер
@JimBalter "Не компетентные" - ха! «Этого почти не требует язык» - поэтому я сказал «условность». Если это идиотизм, это называется «идиотизмом». «Нет returnфункции» - тот факт, что интерпретатор запретит вам регистрировать функцию с именем return, не поможет читателю кода сначала не подвергнуть сомнению его здравомыслие, поэтому этот код является пустой тратой. return(1)это не просто «плохая практика», это опасный признак того, что кто-то не знает, что делает!
хиджарян
2
Значит, вы либо не знаете, что означает слово «обязан», либо меняете свое требование ... в любом случае я не буду тратить на вас больше своего времени.
Джим Балтер
Я сомневаюсь в правильности вашего последнего предложения; returnимеет (на всех языках, которые имеют это ключевое слово) наименьший приоритет. Итак, если присутствует необязательное выражение, оно всегда вычисляется первым.
Волк
4

В операторе return круглые скобки вокруг выражения уже встроены.

В JavaScript, как и во многих других языках (например, C, C ++, Java, Python), оператор return состоит из двух частей: ключевого слова returnи (необязательного) выражения. Таким образом, в любом случае все, что следует за returnключевым словом, сначала оценивается как выражение , после чего оператор return «выполняется» путем передачи управления обратно вызывающей стороне.

Использовать или не использовать круглые скобки - это вопрос стиля , тогда как большинство руководств по стилю запрещают их для тривиальных случаев, подобных тому, что цитируется в вашем вопросе, потому что это делает return ложно похожим на функцию.

Позднее добавление

Если в круглых скобках или без них, никогда не забывайте размещать необязательное выражение после return, то есть в той же строке. Реальная ловушка с returnв JavaScript лежит в добавлении разрыва строки после него:

function test() {
  return 
  1;
}

... потому что testфункция вернется undefined.

Волк
источник
1

добавив круглые скобки, мы убедились, что javascript не вставляет точку с запятой перед несколькими операторами, написанными после возврата, для справки: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

пример :

return a + b;

преобразован в

return; a + b;

пользователя ASI.

Консоль предупредит «о недоступности кода после оператора возврата». Чтобы избежать этой проблемы (чтобы предотвратить ASI), вы можете использовать круглые скобки:

return ( a + b );
код скопирован с: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Рахул Сингх Бхадхория
источник
Это абсолютно правильно и имеет смысл для сложных выражений. Но вы должны добавить в той же строке или сразу после return в первом предложении, чтобы было еще яснее. Я думаю, что голос против произошел из-за неправильного толкования этого.
Волк