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

Есть ли разница между var name = function() {} & function name() {} в Javascript?

Возможный дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}

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

function someGlobalFunction() {
  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }

  utilFunction1();
  utilFunction2();

}

Являются ли эти синонимы? Неужели эти функции полностью перестают существовать, когда возвращается someGlobalFunction? Должен ли я предпочесть один или другой для удобочитаемости или по какой-либо другой причине?

4b9b3361

Ответ 1

Они в основном одинаковы.

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

function someGlobalFunction() {
  utilFunction1(); // Error: untilFunction1 is undefined :(
  utilFunction2(); // Works

  var utilFunction1 = function() {
  }

  function utilFunction2 () {
  }
}

Если они не оказались в ловушке закрытия, оба они перестанут существовать, когда someGlobalFunction вернется.

Я предпочитаю использовать метод, объявленный utilFunction2, но это зависит от вас.

Объявления формы utilFunction2 (которые называются декларациями функций) имеют преимущество имени (т.е. отображаться как utilFunction2) в вашем-любимом-отладчике TM где в качестве utilFunction1 (называемые функциональными выражениями) будет отображаться как анонимная функция.


Для полноты вы также имеете форму;

var utilFunction3 = function utilFunction4() {
    // blah
};

... который называется именованным функциональным выражением, которое странные свойстваbugs (в более старых версиях IE)).

Ответ 2

Да, они совершенно разные:

  • utilFunction1 не имеет имени, поэтому, если он выдает исключение, ваш инструмент отладки будет только сообщать вам, что анонимная функция запустила
  • utilFunction2 будет доступен в объеме функции еще до того, как эта линия будет достигнута (как отметил fletcher)
  • с использованием нотации utilFunction2 может привести к нечетному поведению в определенных обстоятельствах в IE.

Пример:

if (true) {
  function utilFunction() {
    return true;
  }
} else {
  function utilFunction() {
    return false;
  }
}

utilFunction(); // returns false in IE, true everywhere else

IE очень сильно затрагивает проблему области действия функции, эффективно оценивая функции, даже если для них нет пути к ним!

Ответ 3

Поздравляем! Вы нашли ситуацию, в которой задействовано функция Подъем.

var foo = function() { };

сильно отличается от

function foo() { };

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

Второй пример будет "поднят" - он будет доступен в любой точке текущего закрытия (обычно это текущая функция). Даже до того, как оно будет объявлено в пределах указанного закрытия.

Что-то вроде этого будет работать:

function foo() {
    bar();
    function bar() { alert('baz'); }
}

В то время как что-то вроде этого наиболее определенно не будет:

function foo() {
    bar();
    var bar = function bar() { alert('baz'); };
}

В этом втором примере вы получите сообщение об ошибке, поскольку барин еще не определен. Если вы замените две строки в функции foo, этот пример будет работать.

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