Должна ли каждая функция 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
. Таким образом, в прагматичных терминах:
- Вам не нужно писать
return
, вы можете просто позволить исполнению кода "упасть с конца" функции - Если вы возвращаетесь
undefined
, в частности, вы просто return;
запись return;
- При вызове функции вы не можете указать (в коде), закончилось ли выполнение прекращения, закончилось с
return;
, или закончил с return undefined;
; все они выглядят точно так же, как ваш код вызова
Re spec: В частности, когда выполнение функции падает с конца, в спецификации, что "нормальное" завершение; но return;
и return value;
являются "возвратными" пополнениями со связанным значением (undefined
), которое (хотя бы немного) отличается. Но различие устраняется семантикой вызова функции, которая говорит:
...
- Если результат. [[Тип]] является
return
, верните NormalCompletion (результат. [[Значение]]). - ReturnIfAbrupt (результат).
- Возврат NormalCompletion (undefined).
Поэтому нет никакой разницы, которую вы можете наблюдать в коде.