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.

Поделиться
Отправить
9 комментариев
Zeroglif (zeroglif.myopenid.com)

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

isagalaev (softwaremaniacs.org/about/)

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

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

arty (arty.name)

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

Евгений Степанищев (bolknote.ru)

Комментарий для zeroglif.myopenid.com:

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

Евгений Степанищев (bolknote.ru)

Комментарий для softwaremaniacs.org/about/:

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

Евгений Степанищев (bolknote.ru)

Комментарий для arty.name:

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

Евгений Степанищев (bolknote.ru)

Комментарий для splurov.livejournal.com:

Спасибо!

Евгений Степанищев (bolknote.ru)

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

Популярное