Javascript область объявлений функций

Ключевое слово var в javascript заставляет переменную храниться в локальной области. Без var переменные относятся к глобальной области. Как насчет функций? Это ясно, что происходит, когда функции объявляются как переменные

var foo = function() {...}

но какая область

function foo() {...} 

принадлежат?

EDIT: Я понял, что не задал достаточно правильного вопроса, чтобы продолжить. Во внешнем большинстве вложенности есть разница между двумя вышеупомянутыми объявлениями и следующим объявлением?

foo = function() {...}

Ответы

Ответ 1

Он всегда относится к текущей области. Например:

// global scope

// foo is a global function
function foo() {

    // bar is local to foo
    function bar() {

    }

}

Относительно вашего второго вопроса:

foo = function() {...}

является анонимным выражением функции, назначенным глобальной переменной (если вы не используете строгий режим, то foo будет undefined). Разница между этим и function foo() {} заключается в том, что последнее является объявлением функции (по сравнению с объявлением переменной, которому назначено выражение анонимной функции).

Вам может быть интересна эта замечательная статья о декларациях функций и выражениях функций: Именованные функциональные выражения, демистифицированные.

Ответ 2

Объявления функций всегда локальны для текущей области, например, переменной, объявленной с ключевым словом var.

Однако разница заключается в том, что если они объявлены (вместо назначенной переменной), их определение будет поднято, поэтому они будут использоваться повсюду в области видимости, даже если декларация появится в конце кода. См. Также var functionName = function() {} vs function functionName() {}.

Ответ 3

Замечательное различие, учитывающее неявные глобальные значения:

var foo = function() {
  // Variables
  var myVar1 = 42;  // Local variable
      myVar2 = 69;  // Implicit global (no 'var')

  // Functional Expressions
  var myFn1 = function() { ... }  // Local 
      myFn2 = function() { ... }  // Implicit global

  function sayHi() {
    // I am a function declaration. Always local.
  }
}

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

Ответ 4

Ваш первый пример (var foo = function() {...}) называется анонимной функцией. Он динамически объявляется во время выполнения и не выполняет те же правила, что и нормальная функция, но следует правилам переменных.