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