Должна ли каждая функция Javascript возвращать значение?

100

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

До сих пор я использовал это только для языка PHP, и в этом случае Netbeans всегда добавлял @returns {type}часть только в схему комментариев, если следующая функция PHP действительно включала returnоператор. В так называемых «процедурах» (функциях, не возвращающих никакого значения) эта часть отсутствовала.

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

Это меня смутило. Предлагает ли Netbeans такой способ, что каждая функция Javascript должна что-либо возвращать? Что я должен делать? Игнорировать (или удалить) эту часть схемы комментариев или следовать предложению (если это вообще предложение) и добавить return false;в конец такой функции, хотя для меня это бесполезно?

Trejder
источник
6
Если возвращаемое значение не указано, JavaScript вернется undefined. Во многих языках возвращается результат последнего оператора (более полезно, IMO). Это называется неявным возвратом .
Zaz
Отвечает ли это на ваш вопрос? Должен ли я что-то возвращать в функции javascript?
cOborski

Ответы:

190

Краткий ответ: нет.

Реальный ответ да: двигатель JS должен быть уведомлен , что некоторая функция завершила свою работу, которая осуществляется с помощью функции , возвращающей что - то. По этой же причине вместо «завершена» функция называется «вернулась» .
Функция, в которой отсутствует явный оператор возврата 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: Не знаю, наверное, зависит от движка. Если есть разница в производительности, она, скорее всего, будет незначительной. неявный return vs return;, вероятно, полезен только в том случае, если вам нужно вернуться раньше. запись return undefined;может привести к другим результатам, если undefinedразрешит другое значение. Большинство (если не все) браузеры выдают ошибку при попытке переназначить undefined, но теоретически это возможно, вот пример с использованием node.js
Элиас Ван Отегем,
1
@SebastianLasse: я имел в виду voidдругие языки (например, C), где у вас могут быть такие функции void do_someting(int *arg), но у вас не может быть переменной с типом void. В C voidэто на самом деле не тип, поэтому эти функции ничего не возвращают , они просто прыгают
Элиас Ван Отегем
27

Нет, возвращать не нужно.

Но нет возврата на самом деле вернутьundefined

рапсодин
источник
7

Должна ли каждая функция Javascript возвращать значение?

Нет, не делают. Верно, что глубоко в спецификации все они немного отличаются:

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

... но результат вызова каждого из них одно и то же: undefined. Итак, с прагматической точки зрения:

  1. Вам не нужно писать a return, вы можете просто позволить выполнению кода «упасть с конца» функции.
  2. Если вы вернетесь undefined, в частности, просто напишитеreturn;
  3. При вызове функции вы не можете сказать (в коде), завершилось ли выполнение с конца, закончилось return;или закончилось return undefined;; все они выглядят одинаково в вашем коде вызова

Относитесь к спецификации: в частности, когда выполнение функции прекращается, в спецификации это "нормальное" завершение; но return;и return value;оба "возвращают" завершения со связанным значением ( undefined), которое (хоть немного) отличается. Но разница устраняется семантикой вызова функции , которая гласит:

...

  1. Если result . [[Type]] равен return, вернуть NormalCompletion ( result . [[Value]]).
  2. ReturnIfAbrupt ( результат ).
  3. Вернуть NormalCompletion ( не определено ).

Таким образом, в коде нет никакой разницы.

TJ Crowder
источник
2

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

моххан
источник