JavaScript: два синтаксиса определения функции

Смотрите-ка, не я один думал, что два определения функции (через «function f() {}» и «f = function () {}») эквивалентны. Я дочитываю книгу «JavaScript: The Good Parts» (автор — Douglas Crockford), вот до какого места я только что добрался:

A function statement is shorthand for a var statement with a function value.

The statement:

function foo() {}

means about the same thing as:

var foo = function () {}
Мне кажется, что поведение, описанное мною под заголовком «JavaScript: баг с замыканием в FireFox», является хаком браузеров, для того, чтобы все функции, описанные ниже, можно было вызывать из вышестоящих функций.

Дополнение. Надо было вчера дочитать главу, прежде чем спать ложиться. Ниже описывается отличие этих конструкций, упоминается то, что я назвал «хаком браузеров» и даже есть намёк на различное поведение function под if в разных браузерах:

function statement is hoisting. This means that regardless of where a function a placed, it is moved to the top of the scope in which it is defined. This relaxes the requirement that function should be declared before used, which I think leads to sloppiness. It also prohibits the use of function statement in if statement, but they vary in how that should be interpreted. That creates portability problems.
7 декабря 2008 21:43

Zeroglif (zeroglif.myopenid.com)
7 декабря 2008, 22:34

Книжка так себе. Не эквивалентны. Разные конструкции, разное время создания функции, разное поведение при совпадении 'foo', у одной функции есть имя, у другой нет, одна - FunctionDeclaration, другая - FunctionExpression со всеми вытекающими... Если от всего этого абстрагироваться, то в некотором смысле общим станет результат - и там, и там появится новое свойство 'некийобъект.foo'.

isagalaev (softwaremaniacs.org/about/)
8 декабря 2008, 00:40

Насколько я знаю, это фича языка, а не "хак браузеров".

Кроме того, "about the same thing" значит "примерно тоже самое". Я бы тоже так написал, если бы не хотел вдаваться в тонкости, где это неважно :-)

arty (arty.name)
8 декабря 2008, 00:44

about the same thing ≠ эквивалентны

splurov.livejournal.com (splurov.livejournal.com)
8 декабря 2008, 08:10

Отличия в Мозилле: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Functions_and_function_scope#section_14

bolk (bolknote.ru)
8 декабря 2008, 08:38, ответ предназначен Zeroglif (zeroglif.myopenid.com):

Да я уже вижу, что не эквивалентны. «Думал» в моём предложении — это прошедшее время.

bolk (bolknote.ru)
8 декабря 2008, 08:38, ответ предназначен isagalaev (softwaremaniacs.org/about/):

А первая строка цитаты?

bolk (bolknote.ru)
8 декабря 2008, 08:40, ответ предназначен arty (arty.name):

Первую строку цитаты никто не читает?

bolk (bolknote.ru)
8 декабря 2008, 08:40, ответ предназначен splurov.livejournal.com:

Спасибо!

bolk (bolknote.ru)
8 декабря 2008, 08:56

Всем, кто будет дальше комментрировать: посмотрите, я дополнил свою заметку.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)