Чи повинна кожна функція Javascript повертати значення?


99

Я використовую Netbeans для додавання професійних коментарів до кожної функції, я пишу. Тож я починаю кожен із цього, /**а потім натискаю, Enterщоб Netbeans виконав схему коментарів за замовчуванням для наступної функції.

До цього часу я використовував це лише для мови PHP, і в цьому випадку Netbeans завжди додавав @returns {type}участь лише в схемі коментарів, якщо наступна функція PHP дійсно включала returnзаяву. У так званих "процедурах" (функціях, які не повертають жодного значення) ця частина відсутня.

Сьогодні я спробував те ж саме для функції Javascript, і Netbeans додав @returns {undefined}частину до схеми коментарів, хоча наступна функція нічого не повертає.

Це мене бентежило. Чи пропонує Netbeans таким чином, що кожна функція Javascript повинна повертати що-небудь? Що я повинен зробити? Ігнорувати (або видаляти) цю частину схеми коментарів або слідувати пропозиціям (якщо це взагалі є пропозицією) і додати return false;в кінці такої функції, хоча це для мене марно?


6
Якщо значення повернення не вказано, JavaScript повернеться undefined. У багатьох мовах повертається результат останнього твердження (корисніше, IMO). Вони називаються неявними поверненнями .
Заз

Чи відповідає це на ваше запитання? Чи потрібно повертати щось у функції javascript?
cOborski

Відповіді:


189

Коротка відповідь - ні.

Реальний відповідь так: двигун JS повинен бути повідомлений , що деяка функція завершила свою роботу, яка здійснюється з допомогою функції , що повертає що - то. Це також, чому замість "готової" функція, як кажуть , повернулася .
Функція, якій не вистачає явного оператора return undefined, повернеться , як повертається функція C (++), яка не має значення повернення, і її підпис відображає це void:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

Крім того, в JS, як і в більшості всіх мов, ви можете просто ігнорувати повернене значення функції, що робиться дуже багато:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

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

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


5
Я не вірю, що C ++ (або C) "повертає порожнечу". Тег "void" вказує, що він нічого не повертає. Хоча це другорядний момент і не має нічого спільного з заданим питанням.
Джей

2
Це не на самому ділі повернутися void, він нічого не повертає, але його підпис відображає це через voidтип повертається значення .
Еліас Ван Оотегем

чи є якісь переваги від ефективності для явного повернення проти неявного?
4m1r

@ 4m1r: Я не знаю, це, мабуть, залежить від двигуна. Якщо є різниця в продуктивності, швидше за все, це буде незначно. неявне повернення проти return;, мабуть, корисне лише в тому випадку, якщо вам потрібно повернутися достроково. написання return undefined;може призвести до різних результатів, якщо воно undefinedмає інше значення. Більшість веб-переглядачів (якщо не всі) будуть видавати помилку при спробі перепризначити невизначений, але теоретично, ось такий приклад можна використовувати node.js
Elias Van Ootegem

1
@SebastianLasse: Я мав на увазі voidінші мови (наприклад, C), де ви можете мати такі функції, як void do_someting(int *arg), але ви не можете мати змінну з типом void. В C voidнасправді не тип, тому ці функції нічого не повертають , вони просто стрибають
Elias Van Ootegem

26

Ні, повертати не потрібно.

Але повернення фактично не повертаєundefined


6

Чи повинна кожна функція Javascript повертати значення?

Ні, вони ні. Це правда, що глибоко в специфікації всі вони дещо різні:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... але результат виклику кожного з них одне і те ж: undefined. Тож у прагматичному плані:

  1. Вам не потрібно писати return, ви можете просто дозволити виконанню коду "відпасти з кінця" функції
  2. Якщо ви повертаєтесь undefined, конкретно, ви просто пишетеreturn;
  3. Під час виклику функції ви не можете сказати (у коді), чи не завершилось виконання return;, чи закінчилося чи закінчилося return undefined;; всі вони виглядають точно так само, як і ваш телефонний код

Re spec: Зокрема, коли виконання функції відпадає від кінця, у специфікації це "нормальне" завершення; але return;і return value;є обома доповненнями "return" із пов'язаним значенням ( undefined), яке (колись так мало) відрізняється. Але різниця усувається семантикою виклику функції , яка говорить:

...

  1. Якщо результат . [[Тип]] є return, поверніть NormalCompletion ( результат . [[Значення]]).
  2. ReturnIfAbrupt ( результат ).
  3. Повернути нормальнеЗавершення ( невизначено ).

Тож немає різниці, яку ви можете спостерігати в коді.


2

Ні, вам не потрібно повертати щось для кожної функції. Це необов'язково і до того, як ви пишете логіку коду.

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