同じことを比較しないからです。あなたの例では、関数宣言 function foo()...を変数宣言および代入と比較しますvar foo = 'bar';
より正確な比較は次のようになります。
console.log(foo);
var foo = 'bar';
と
console.log(foo());
var foo = function() {
 return 'bar';
}
機能宣言は、巻き上げの仕組みによって解釈が異なります。巻き上げると、すべての宣言が最も近いスコープの一番上に移動し、割り当てはそのままになります。
関数宣言は、その意味で特別です。これは、1つのステートメントでの宣言と式/割り当ての両方であり、したがって一緒に持ち上げられるためです。
例として:次のような式を見ることができます:
console.log(foo);
var foo = 'bar';
このように:
var foo;
console.log(foo); //prints undefined
foo = 'bar';
と
console.log(foo());
var foo = function() {
 return 'bar';
}
このように:
var foo;
console.log(foo());
foo = function() {
 return 'bar';
}