Подтвердить что ты не робот

Когда я должен хранить функцию в переменной?

Я изучаю JavaScript на данный момент, и я не совсем понимаю, когда писать функцию в переменную.

Например, оба следующих блока кода выполняют то же самое в Node.js:

 var onReq = function(req, res) {
   res.write('Hello');
 };

 http.createServer(onReq).listen(3000);

и

function onReq(req, res) {
   res.write('Hello');
 }

 http.createServer(onReq).listen(3000);



Какой лучший способ делать в соответствии с лучшими практиками и почему?

4b9b3361

Ответ 1

Обычно я использую только var funcName = function(){}, когда мне нужно будет переопределить действие для этой функции позже. Например:

var foo = function(a){ return a * 2; }
var bar = foo(2);

foo = function(a){ return a / 2; }

bar = foo(bar);

В противном случае, для большинства целей (при условии, что это не обратный вызов или модификатор) объявление функции "классически" обычно приемлемо.

Ответ 2

По умолчанию используется версия non-variable function onReq(){}. Это не уловимое решение, которое я сделал, но размышление об этом приводит следующие аргументы:

  • Он выглядит чище.
  • Это концептуально проще: это просто функция, а другая - функция и переменная. Это небольшая вещь, но я считаю ее ценной, тем не менее.
  • Он уверяет меня, что onReq всегда будет ссылаться на это тело функции - что нужно учитывать при чтении кода. Аналогично маркировке переменной как final в Java.
  • Сохраняет меня от "случайно", заменяя функцию, вызывая непреднамеренные побочные эффекты в другом месте.

Ответ 3

Вот объяснение:

Существует различие между именем функции и переменной, которой назначена функция:

  • Имя функции не может быть изменено, а переменная, назначенная функции, может быть переназначена.
  • Имя функции может использоваться только внутри тела функции. Попытка использовать его вне тела функции приводит к ошибке (или undefined, если имя функции было объявлено ранее с помощью инструкции var).

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

Ответ 4

Согласно статье Джона Ресига JavaScript как первый язык, ваш первый блок кода считается лучшей практикой.

Ответ 5

Я лично столкнулся с некоторыми проблемами при вызове локальных функций (функций, объявленных внутри других функций) при использовании синтаксиса без переменных в некоторых версиях IE (скорее всего, IE8 или ниже), в то время как переменный синтаксис действительно работал, как ожидалось.

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

Ответ 6

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

В приведенном ниже коде, определяющем фильтр Angular, если я определяю функцию внутри переменной, я не могу ее успешно вызвать из метода фильтра. Может ли кто-нибудь объяснить мне техническую причину этого?

См. код (комментарий не работает):

angular
    .module('loc8rApp')
    .filter('formatDistance', formatDistance);

function formatDistance(){
        return function (distance) {
        var numDistance, unit;
        if (distance && _isNumeric(distance)) {
         if (distance > 1) {
            numDistance = parseFloat(distance).toFixed(1);
            unit = 'km';
          } else {
            numDistance = parseInt(distance * 1000,10);
            unit = 'm';
          }
          return numDistance + unit;
        } else {
          return "?";
        }
      };
};

var _isNumeric = function (n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
};

/*
var formatDistance = function () {
  return function (distance) {
    var numDistance, unit;
    if (distance && _isNumeric(distance)) {
      if (distance > 1) {
        numDistance = parseFloat(distance).toFixed(1);
        unit = 'km';
      } else {
        numDistance = parseInt(distance * 1000,10);
        unit = 'm';
      }
      return numDistance + unit;
    } else {
      return "?";
    }
  };
};
*/

Заранее благодарю вас!

Ответ 7

Я вижу, что никто не упомянул (прямо и практически - что, по-видимому, этот вопрос) причину, по которой я лично нахожу наиболее полезной для хранения функций в переменных. Эта причина имеет дело со сложной логикой, которая требует большого выбора (например, if) для определения дальнейших действий, для которых должны вызываться разные функции, возможно, с разными наборами входов. Это делает код чище, когда этот дальнейший курс действий запускается только в одном месте, в конце нашей логики.

function fooA (input) {...};
function fooB (input) {...};
let chosenHandler;
let chosenInput;

// Here we establish which function is relevant
if (someCondition) chosenHandler = fooA;
else chosenHandler = fooB;

// Here we establish which parameter should be used
if (someOtherCondition) chosenInput = 'First input';
else chosenInput = 'Second input';

// Call chosen function with chosen parameters - one place, nice and clean
chosenHandler(chosenInput);

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