Простите меня, если это неправильный подход к добавлению точки. Я нечасто бывал здесь и приветствовал бы конструктивные указания и / или критику.
Ответ Бенджамина отлично отвечает на вопрос ОП, но я хотел бы добавить одну настройку, которая даст нам полный обзор подъема и его странностей.
Если мы начнем исходный код с вызова f
, например:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Результатом будет:
Me duplicate.
Me original.
Причина в том , что var
и function
заявления водрузили по - разному.
Для var
в декларации перемещаются в начало текущей области видимости *, но любое задание не поднимается. Что касается значения объявленной переменной, оно не определено до тех пор, пока не будет достигнута исходная строка присвоения.
Для function
операторов поднимаются и объявление, и определение. Функциональные выражения , используемые в var f = function() {...
конструкции, не поднимаются.
Итак, после подъема выполнение выглядит так, как если бы код был:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* Вся область видимости JavaScript является лексической, или функцией, областью видимости, но казалось, что использование слова f в этот момент просто сбивает с толку.