Должна ли каждая функция 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 (неопределено).
так что нет никакой разницы, вы можете наблюдать в коде.