Проблема и ответ на этот вопрос - то, что многие называют Hoisting
.
Подобные объявления функций интерпретируются как parsing time
, а не при выполнении. Проще говоря, второе объявление функции f()
перезаписывает первое, и поэтому возвращаемое значение равно 2
.
Подъем происходит на function declarations
и scoped variables
(объявляется с var
). Например:
(function() {
if( false ) {
var hello = 10;
}
console.log( hello );
}());
console.log вернет undefined
и не выдаст здесь исключение. Даже если if statement
никогда не встречается, переменная была объявлена в function context
.