Яка різниця між поверненням і поверненням ()?


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

Я випробував вищевказаний код на консолі Chrome, і обидва повернувся 1.

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

Я також перевірив код вище, і обидві функції повернулися "1".

Тож у чому різниця між використанням returnта return()?


21
Відповіді тут також стосуватимуться void(x),typeof(x)
Пол С.

3
@ PaulS. - завжди був спантеличений тим, що void(0)він повинен бути скороченим для невизначених . Тож якщо це стенограма, навіщо включати зайві символи? ;-)
RobG

1
@RobG Я думаю, що це перенесення з Python і може бути корисним для особливих випадків, коли ви хочете включити операторів void i = 1; // ReferenceErrorпротиvoid (i = 1); // undefined
Paul S.

1
Вас може розчарувати це питання, яке ваше питання стосується C #: stackoverflow.com/questions/2186595/…
Ерік Ліпперт

Відповіді:


177

Те саме, що між

var i = 1 + 1;

і

var i = (1 + 1);

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

return- це не функція, а твердження . Він синтаксично схожий з іншими простими операторами управління потоком, як, breakі continueвони також не використовують круглі дужки.


12
Оператор повернення може супроводжуватися виразом. Повернення повинно бути у функції, тому функція повертає значення виразу або, якщо його немає, не визначене .
RobG

37
@ chris97ong: повернення не є функцією.
RemcoGerlich

34
Якби ви зробили returnфункцію, як би ви повернули їй значення?
dan04

4
Це чудова відповідь із чудовим прикладом, але я думаю, що варто додати, що «повернення» не є функцією в основній відповіді - враховуючи, що це корінь непорозуміння, що призвело до цього питання.
BiscuitBaker

3
@BiscuitBaker: я трохи додав. Коли я записав цю коротку відповідь, я не очікував, що вона отримає 50+ оновлень ...
RemcoGerlich,

21

Різниці немає.

returnне є викликом функції, але є мовним твердженням. Все, що ви робите з дужками, - це просто згрупувати ваше повернене значення, щоб його можна було оцінити. Наприклад, ви можете написати:

return (x == 0);

У цьому випадку ви повертаєте значення твердження x == 0, яке поверне булеве значення trueабо falseзалежно від значення x.


6
return - це ключове слово, яке означає початок заяви про повернення .
RobG

1
Оцінка заяви про повернення не потребує "групування". Тож у будь-якому випадку буде бульне повернення.
Вовк

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) повернення заяви. Серед багатьох речей, це говорить вам:

повернути [тут немає LineTerminator] Вираз;

що ви можете надати вираження return. Експресія hello, Math.abs(x), yourCustomFunc(7)або в вашому другому випадку це може бути 1або (1). Висловлення 1після оцінювання - те саме, що (1)і те саме, що (((((1))))))або навіть як щось дійсно химерне (+(!(+(!1)))).


1
+1 для офіційної довідки. Хіба немає посилання на сторінку? - HTML-код однієї сторінки завантажується дуже довго.
Вовк

@Wolf я такого не знайшов. Ось ще одна, але це також одна сторінка people.mozilla.org/~jorendorff/…
Сальвадор Далі

Так, сумно. Я також не мав би успіху. Що щодо розширення вашої цитати на весь синтаксис повернення заяви?
Вовк

9

Різниці немає, дужки необов’язкові. Дивіться MSDN :

return[(][expression][)];

Необов'язковий аргумент виразу - це значення, яке потрібно повернути з функції. Якщо його опустити, функція не повертає значення.

Ви використовуєте оператор return, щоб зупинити виконання функції та повернути значення виразу. Якщо вираз опущено, або оператор повернення не виконується в межах функції, вираз, який викликав поточну функцію, присвоюється значенням невизначеним.


8
Тільки МС думає зробити групування "необов'язковим" у виписці з повернення . Вони є настільки ж «необов’язковими», як і в будь-якому виразі, або в багатьох інших частинах граматики.
RobG

@RobG: Але, мабуть, вони набагато частіше запитують у returnзаяві. : P MS, напевно, набридла ставити запитання від JS noobs.
cHao

2
Пояснення M $ невірно. The (), не є частиною заяви про повернення.
Салман А

4
"Є різниця для читача". Ну, да: MSDN від специфікації помилково припускає , що return (expressionі return expression)є законними.
Джим Балтер

2
@JimBalter Поряд з return (), return (і return ): P
Пол

9

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

Як було зазначено, додаткові дужки впливають на порядок оцінки, але не використовуються для "виконання" названої функції return. Ось чому ці рядки працюють без проблем:

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

Вони фактично ідентичні цим рядкам:

return 1;
var a = 1;

Причина return()кидає синтаксичну помилку - саме з цієї причини наступний рядок видає помилку (повернення, включене для порівняння):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

І як бічна записка, якщо 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

У зворотному операторі дужки навколо виразу вже вбудовані.

У JavaScript, як і в багатьох інших мовах (наприклад, C, C ++, Java, Python), оператор 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


Це абсолютно правильно, і таким чином має сенс складні вирази. Але вам слід додати в тому ж рядку або безпосередньо за поверненням у першому реченні, щоб зробити це ще більш зрозумілим. Я думаю, що голосування є наслідком неправильного тлумачення цього.
Вовк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.