Ответ 1
Я предполагаю, что разница в том, что первая не видна глобальной области, а вторая видна глобально.
Во время чтения о IronJS я могу найти статью здесь http://ironjs.wordpress.com/
В нем указано следующее:
* Ключевое слово функции контекстно-зависимого
Если вы не знаете, эти две функции не идентичны:
(function bar() { })
function foo() { }
Узнав разницу, я оставляю в качестве упражнения читателю.
Можно ли объяснить здесь разницу?
Я предполагаю, что разница в том, что первая не видна глобальной области, а вторая видна глобально.
function foo() { }
Создает функцию
(function foo(){ })
Возвращает объект функции. Вы также можете использовать:
(function foo(){ })(bar)
И сделайте анонимную функцию. (Обратите внимание, что (bar)
означает, что внутри этой функции this
ссылается на экземпляр bar
.)
За дополнительной информацией обратитесь к этому другому сообщению SO.
Чтобы расширить ответ на @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
Здесь мы имеем факториальную функцию с именем "факт", но имя "факт" видимо только внутри области самой функции.
Первая функция - это анонимная функция (да). Выражение оценивается как Function
. Второй определяет именованную функцию и возвращает undefined
.