Различия между типами объявлений функции Javascript

Во время чтения о IronJS я могу найти статью здесь http://ironjs.wordpress.com/

В нем указано следующее:

* Ключевое слово функции контекстно-зависимого

Если вы не знаете, эти две функции не идентичны:

(function bar() { })  

function foo() { } 

Узнав разницу, я оставляю в качестве упражнения читателю.

Можно ли объяснить здесь разницу?

Ответ 1

Я предполагаю, что разница в том, что первая не видна глобальной области, а вторая видна глобально.

Ответ 2

function foo() { }

Создает функцию

(function foo(){ })

Возвращает объект функции. Вы также можете использовать:

(function foo(){ })(bar)

И сделайте анонимную функцию. (Обратите внимание, что (bar) означает, что внутри этой функции this ссылается на экземпляр bar.)

За дополнительной информацией обратитесь к этому другому сообщению SO.

Ответ 3

Чтобы расширить ответ на @Amir:

js>(function bar() {})(3)
js>bar
console:1       ReferenceError: bar is not defined
js>function foo() {}
js>foo
function foo() {
}

(код выполнен в jsdb)

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

В качестве третьего примера:

var x = function baz() {};

Если вы запустите это:

js>var x = function baz() {}
js>baz
console:1       ReferenceError: baz is not defined

Вы заметите, что это похоже на (function baz(){})(3).

Случай

function foo() {}

является особенным, интерпретатор Javascript видит эту форму и говорит: "О, вы пытаетесь определить функцию с именем" foo "в локальной области."

Что касается того, почему именованная функция полезна, даже если она не определяется в локальной области - именованная функция видна из области самой функции:

js>var x = function fact(n) { return n*((n < 2) ? 1 : fact(n-1)); }
js>x(3)
6
js>fact
console:1       ReferenceError: fact is not defined

Здесь мы имеем факториальную функцию с именем "факт", но имя "факт" видимо только внутри области самой функции.

Ответ 4

Первая функция - это анонимная функция (да). Выражение оценивается как Function. Второй определяет именованную функцию и возвращает undefined.