Необходим ли ‘return’ в последней строке функции JS?

#javascript

#javascript #функция

Вопрос:

Какова наилучшая практика для завершения функции JavaScript, если она ничего не возвращает?

 function foo(a) {
    if (a) {
        setTimeout()
    }

    return;
}
  

В этом случае return нет необходимости, но я оставляю это для удобства чтения. Я также попытался поискать в Google, является ли это способом микрооптимизации JS, но ничего не смог найти.

Комментарии:

1. если он ничего не возвращает, то вам не нужен оператор return. это ничего не ускоряет, помещая его туда.

2. На мой взгляд, удаление return делает его более читаемым, поскольку вам это вообще не нужно.

3. Если бы вы запустили этот код через минификатор, это удалило бы это return; . Следовательно, это не оптимизация какого-либо рода. Если вы должны сохранить его, обязательно включите завершающую точку с запятой из-за правил автоматической вставки точки с запятой. Смотрите документацию для получения дополнительной информации.

Ответ №1:

какова наилучшая практика завершения функции JS, если она ничего не возвращает?

Функция возвращает undefined по умолчанию. Поэтому использование return необходимо только в том случае, если вы хотите переопределить поведение по умолчанию.


Почему большинство не учитывает это, когда они могут

Сообществу Javascript, похоже, не нравится ненужный подробный код. Можно даже сказать, что это спорт — сделать код как можно более коротким и компактным.

Почему это может быть не лучшей практикой для всех

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

Однако опытный программист глубоко усвоит такие соображения и поэтому редко нуждается в таких напоминаниях.

Заключение

По мере накопления опыта спорт для менее подробного кода усиливается, и в этом контексте написание кода, просто подтверждающего поведение по умолчанию, является абсолютным запретом.

Итак: в конечном итоге я бы сказал, что большинство людей в конечном итоге оставляют это, и что это оправдано из-за высокой степени интернализации.

Ответ №2:

Нет, return оператор не является необходимым в конце функции void (извините за C-термины там). Однако, если вы хотите завершить работу функции раньше (скажем, если определенное условие не было выполнено), вы будете использовать return оператор, даже если вы не возвращаете значение.

Включение оператора return в конце функции void для удобства чтения должно быть в порядке. Честно говоря, я не думаю, что это сильно увеличит ваш объем.

На мой взгляд, однако, вам не следует включать оператор return в конец функции, которая ничего не возвращает.

Ответ №3:

Просто для развлечения и, к вашему сведению, я написал небольшой тестовый скрипт, чтобы опробовать его.

К моему удивлению, оператор с return возвращался быстрее, чем без него, примерно на 100 мс примерно за дюжину запусков в Firefox (Gecko). Этот результат был довольно последовательным как на Mac, так и на Ubuntu.

Я также запускал его в Chrome (WebKit), и результаты были гораздо более неоднозначными, вообще не было большой согласованности.

Это были мои результаты, и они никоим образом не являются окончательными. Не стесняйтесь попробовать это сами. На мой взгляд, ваши личные предпочтения в любом случае более актуальны, чем 100 мс. Если это так, то добавьте его.

 function f1(){
    console.log("doing stuff 1");
}

function f2(){
    console.log("doing stuff 2");
    return;
}

var start = (new Date()).getTime();
var i = 1000; while(i--) f1();
var time1 = (new Date()).getTime() - start;

var start = (new Date()).getTime();
var i = 1000; while(i--) f2();
var time2 = (new Date()).getTime() - start;

console.log("Without return: " time1);
console.log("With return: " time2);
  

Вот скрипка.

Комментарии:

1. Результаты вашего JSFiddle кажутся совершенно случайными. Иногда функция без оператора return выполняется быстрее (в соответствии с вашим временем), а в других случаях функция, с оператором return, выполняется быстрее. Я не думаю, что эта информация достаточно точна, чтобы сформировать однозначный вывод.

2. я согласен, Бринден. сравнительный анализ, как правило, ненадежен с javascript, поскольку существует так много разных интерпретаторов и версий.. однако при моей настройке, FF на Mac, тот, у которого есть возврат, каждый раз возвращался первым.

Ответ №4:

Функции со стрелками (поиск Remove the body brackets and word "return" -- the return is implied ), тело которых представляет собой одну строку и без фигурных скобок, не требуют return инструкции, даже для не void функций. Пример.

 var returnTest = () => 1   1;
returnTest(); // Outputs 2

var returnTest2 = () => { 1   1};
returnTest2(); // Outputs undefined
  

AFAIK и помимо void функций, это единственный экземпляр, в котором return может быть пропущено.

Комментарии:

1. Это правильно, но довольно раздражает. Ruby разрушил меня, поскольку он всегда автоматически возвращает последнее значение в стеке. Я бы хотел, чтобы returnTest2 просто выдавал ошибку при попытке переноса из Typescript, но, увы…

Ответ №5:

Добавление ненужного return оператора не будет иметь никакого реального значения с точки зрения оптимизации. Пишите код для людей, а не для компьютеров.

Это не нужно, если вы не будете использовать функцию для получения результата (т. Е. sum(2, 3) ), такого как:

 function xxx(){
  post().then(function(){
    location.href('http://stackoverflow.com');
  }, function(){
    showError();
  });
}
  

Вы видите, что у меня есть 3 функции, и все они имеют оператор not return , и это просто прекрасно.

Зайдя в раздел мнение, я бы сказал, что вы могли оставить это для удобства чтения и удобства, но у вас был бы подход, отличный от большинства программистов. И поскольку чем меньше, тем лучше (KISS), и если это вообще не нужно, лучше это опустить.

PS: Результат функции без return , будет undefined , естественно.

  function a(param){
   var x = param;
 }
 function b(param){
   var x = param;
   return;
 }
 function c(param){
   var x = param;
   return x;
 }
 a(5); // undefined
 b(5); // undefined
 c(5); // 5
  

Ответ №6:

Как заявили другие люди, это не обязательно. Но некоторые люди находят это хорошей практикой. особенно, когда вам нравится быть декларативным, и вы знаете, что оператор return — это не что иное, как GOTO оператор. (представьте, что ваше программирование полностью линейно, и вы можете перемещаться только между кодом с метками и операторами goto). Таким образом, вы всегда объявляете, куда вы направляетесь: вы возвращаетесь.

Еще одна причина для возврата void

Например, у вас может быть следующая функция

 function login(user, pass){
  if(user === null)
    return;
  doTheRest(user, pass);
}
  

Таким образом, в методе void вы можете вернуть ‘early’, чтобы убедиться, что вы не продолжаете, когда условие не выполнено. Это то, что также называется защитным программированием.

примечание: в большинстве случаев вам лучше вместо этого выдавать ошибку throw new Error(...) . Таким образом, вы понимаете, что ранее вы забыли выполнить предварительное условие.

Ответ №7:

Нет необходимости использовать return оператор, но рекомендуется использовать void operator, который заставляет ключевое слово функции обрабатываться как выражение, а не как объявление.

Но тогда ваша функция должна выглядеть так:

 void function (a) {if (a) {setTimeout()}}
  

Если вы объявляете выражение функции, не вызываемое немедленно, ваш должен:

  • return true

или

  • return !failure;

Комментарии:

1. мы не указываем типы возвращаемых функций в JavaScript.

2. Согласно ссылке MDM JavaScript , правильно определить тип возвращаемой функции.

3. void является оператором js и не имеет ничего общего с функциями. в Java, например, void — это модификатор функции, а не просто оператор, который можно поместить туда, если разработчику этого захочется. это не одно и то же.

4. На самом деле он не используется перед функцией, его чаще используют в ссылках <a href="javascript:void(...);"

5. Его можно использовать, чтобы заставить ключевое слово функции обрабатываться как выражение, а не как объявление. Итак, это operator.