Пробачте, якщо це неправильний спосіб підійти до додавання балів. Я не був тут дуже багато, і я вітаю конструктивне керівництво та / або критику.
Відповідь Бенджаміна чудово відповідає на питання ОП, але я хотів би додати ще один виправлення, яке дасть нам повну подорож підйомного обладнання та його дивацтва.
Якщо ми починаємо оригінальний код із заклику до f
, так:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Вихід тоді буде:
Me duplicate.
Me original.
Причина в тому , що var
і function
заяви поставили по - різному.
Для var
в декларації переміщаються на початок поточного області видимості *, але будь-який завдання не піднімається. Що стосується значення оголошеного 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 у цьому пункті.