Wybacz mi, jeśli to niewłaściwy sposób dodawania punktu. Nie byłem tu zbyt często i przyjąłbym konstruktywne wskazówki i / lub krytykę.
Odpowiedź Benjamina doskonale odpowiada na pytanie OP, ale chciałbym dodać jedną poprawkę, która da nam pełną prezentację podnoszenia i jego osobliwości.
Jeśli zaczniemy oryginalny kod od wezwania do f:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Wynik będzie wtedy:
Me duplicate.
Me original.
Powodem jest to, vara functionoświadczenia są podnoszone na nieco inne sposoby.
Na vartej deklaracji jest przesuwana do góry bieżącego Zakres *, ale każde zadanie nie jest podniesiona. Jeśli chodzi o wartość zadeklarowanej zmiennej, jest ona niezdefiniowana, dopóki nie zostanie osiągnięta pierwotna linia przypisania.
W przypadku functioninstrukcji podnoszona jest zarówno deklaracja, jak i definicja. Wyrażenia funkcyjne użyte w var f = function() {...konstrukcji nie są podnoszone.
Więc po podniesieniu wykonanie wygląda tak, jakby kod był:
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();
* Cały zakres JavaScript jest leksykalny lub funkcjonalny, ale wydawało się, że użycie słowa f w tym momencie byłoby po prostu pomieszane.