Пишу, по большей части, про историю, свою жизнь и немного про программирование.

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) 2008

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

isagalaev (softwaremaniacs.org/about/) 2008

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

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

arty (arty.name) 2008

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо!

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

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