Да. Я думаю, что происходило следующее:
Функции, объявленные с function test(...) { ... }
, поднимаются в верхнюю часть текущей области. Таким образом, оба определения вашей функции, использующие этот синтаксис, были подняты наверх, но второе определенное значение переписало первое, что привело к результату «baz.»
Функциональные выражения не отображаются, например test = function (...) {...}
. Поэтому, когда вы переназначали идентификатор test
для этого выражения функции, он стал значением для test
для оставшейся части вашего сценария.
Как уже отмечалось, вы не можете перегружать переменные или функции в JavaScript. Вы можете перезаписать переменные новыми значениями, что вы и сделали в своем примере. Что сбивает с толку, так это то, как JavaScript работает.
Если вы хотите избежать подъема, используйте let myFn = function (...) { ... }
.
Вот строка за строкой, насколько я понимаю:
// `test` defined with func declaration, hoisted to top
function test() {
return 'foo';
}
console.log(test);
console.log(test());
// `test` overwritten with function expression, hoisting has already occurred,
// `test` identifier will have this value for remainder of script
test = function() {
return 'bar';
}
console.log(test);
console.log(test());
// `test` overwritten with new func declaration, hoisted to top, but after first declaration
function test(a, b) {
return 'baz';
}
console.log(test);
console.log(test());
console.log(test(true));
console.log(test(1, 2));