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

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

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

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

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

Ответ 1

Короткий ответ - нет.

Реальный ответ: да, 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 или неявно. Если функция возвращается неявно, ее возвращаемое значение всегда будет undefined.

Ответ 2

Нет, return не требуется.

Но return не возвращает undefined

Ответ 3

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

Ответ 4

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

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

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

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

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

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

...

  1. Если результат. [[Тип]] является return, верните NormalCompletion (результат. [[Значение]]).
  2. ReturnIfAbrupt (результат).
  3. Возврат NormalCompletion (undefined).

Поэтому нет никакой разницы, которую вы можете наблюдать в коде.