Я написал следующий сценарий, чтобы посмотреть, что происходит, когда имена переменной и функции, которой назначена функция, совпадают:
var f = function() {
console.log("Me original.");
}
function f() {
console.log("Me duplicate.");
}
f();
В результате я получаю «Я оригинальный». Почему не была вызвана другая функция?
Кроме того, если я изменяю свое исходное назначение на var f = new function() {
, я получаю «Я исходный», за которым следует сообщение TypeError object is not a function
. Кто-нибудь может объяснить?
javascript
function
анкуш981
источник
источник
Ответы:
Объявления функций поднимаются (перемещаются вверх) в JavaScript. Код, который у вас неверен с точки зрения порядка синтаксического анализа, семантически совпадает с приведенным ниже, поскольку объявления функций поднимаются:
Что, в свою очередь, за исключением имени функции совпадает с:
Что, в свою очередь, из-за подъема переменных совпадает с:
Это объясняет, что вы получаете, вы отменяете функцию. В общем,
var
в JavaScript разрешено несколько объявлений -var x = 3; var x = 5
это совершенно законно. В новом стандарте ECMAScript 6let
это запрещено операторами.Эта статья @kangax делает фантастическую работу по демистификации функций в javascript.
источник
function f()
дляvar f = function()
так много? Действительно ли подъем и имена функций - единственная разница?f
поднимаются, а"Me Original"
версия просто поднимается позже , каждая из них перемещается наверх, но в том же порядке. Я просто хотел бы добавить, что, как правило, нельзя называть несколько функций одинаково :)var
использовать одно и то же имя дважды в одной и той же области.Если не похоже, что кто-то ответил на ваш дополнительный вопрос, поэтому я отвечу на него здесь, хотя обычно вам следует задавать дополнительные вопросы как отдельные вопросы.
Вы спросили, почему это:
распечатывает "Я оригинал". а потом ошибка.
Здесь происходит то, что
new
эта функция используется в качестве конструктора. Это эквивалентно следующему:И благодаря функции подъема, которую объяснил Бенджамин, приведенное выше по существу эквивалентно следующему:
Это выражение:
вызывает создание и назначение нового объекта с
f
использованием анонимной функции в качестве конструктора. "Я оригинален". распечатывается по мере выполнения конструктора. Но созданный объект сам по себе не является функцией, поэтому, когда это в конечном итоге выполняется:вы получите сообщение об ошибке, потому что
f
это не функция.источник
Простите меня, если это неправильный подход к добавлению точки. Я нечасто бывал здесь и приветствовал бы конструктивные указания и / или критику.
Ответ Бенджамина отлично отвечает на вопрос ОП, но я хотел бы добавить одну настройку, которая даст нам полный обзор подъема и его странностей.
Если мы начнем исходный код с вызова
f
, например:Результатом будет:
Причина в том , что
var
иfunction
заявления водрузили по - разному.Для
var
в декларации перемещаются в начало текущей области видимости *, но любое задание не поднимается. Что касается значения объявленной переменной, оно не определено до тех пор, пока не будет достигнута исходная строка присвоения.Для
function
операторов поднимаются и объявление, и определение. Функциональные выражения , используемые вvar f = function() {...
конструкции, не поднимаются.Итак, после подъема выполнение выглядит так, как если бы код был:
* Вся область видимости JavaScript является лексической, или функцией, областью видимости, но казалось, что использование слова f в этот момент просто сбивает с толку.
источник