JS如何在语句块中声明没有词法范围的变量和函数?

Dra*_*ang 5 javascript scope lexical-scope

var a; 
{
  function a() {}
  a = 60;
  console.log('1: ', a);
}
console.log('2: ', a);

var b; 
{
  b = 60;

  function b() {}
  console.log('3: ', b);
}
console.log('4: ', b);
Run Code Online (Sandbox Code Playgroud)

输出为:

1: 60
2: f a() {}
3: 60
4: 60
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,如果除去花括号,它全部打印出来60。也许是因为吊装。但是据我所知,函数声明没有词法范围,即使有,它的第一个输出也应该打印函数,对吗?