Должна ли каждая функция Javascript возвращать значение?
Я использую Netbeans для добавления профессиональных комментариев к каждой функции, я пишу. Поэтому я начинаю каждый из них с /**
и затем я нажимаю Enter
чтобы Netbeans выполнял схему комментариев по умолчанию для следующей функции.
до сих пор я использовал это только для языка PHP, и в этом случае Netbeans всегда добавлял @returns {type}
часть в схеме комментариев только, если следующая функция PHP действительно включена return
заявление. О так называемых " процедурах "(функциях, которые не вернуть любое значение) эта часть отсутствовала.
сегодня я попробовал то же самое для функции Javascript и Netbeans добавил @returns {undefined}
часть для комментария схемы, даже если следующая функция ничего не возвращает.
это меня смутило. Предполагает ли Netbeans, что каждая функция Javascript должна возвращать что-либо? Что мне делать? Игнорировать (или удалить) эту часть схемы комментариев или следовать предложению (если это предложение вообще) и добавить return false;
в конце такой функция, хотя она бесполезна для меня?
4 ответов
короткий ответ: нет.
на реальные ответ да: движок 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
заявление, или неявно. Если функция возвращает неявно, ее возвращаемое значение всегда будет неопределенным.
должна ли каждая функция Javascript возвращать значение?
нет, не знают. Это правда, что глубоко в спецификации, это все немного другое:
function foo() {
}
function foo() {
return;
}
function foo() {
return undefined;
}
...но результат вызов у каждого из них один и тот же: undefined
. Итак, в прагматических терминах:
- вам не нужно писать
return
, вы можете просто позволить выполнению кода "упасть с конца" функция - если вы возвращаете
undefined
, в частности, вы просто напишитеreturn;
- при вызове функции вы не можете сказать (в коде), упало ли выполнение с конца, закончилось
return;
, или закончилсяreturn undefined;
; они все выглядят точно так же для вашего вызывающего кода
Re спецификация: в частности, когда выполнение функции падает с конца, в спецификации это" нормальное " завершение; но return;
и return value;
как "возвращение" дополнения со связанным значением (undefined
), который (хотя бы немного) отличается. Но разница устраняется семантикой вызов функции, которые говорят:
...
- если результат.[[Type]] is
return
, возврат NormalCompletion (результат.[[Значение.)]]- ReturnIfAbrupt (результат).
- вернуться NormalCompletion ( undefined).
таким образом, нет никакой разницы, которую вы можете наблюдать в коде.