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


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

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

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

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

4 81

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

нет, return не надо.

а не return на самом деле вернуть undefined

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

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

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

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

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

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

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

...

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

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