原题

  1. {
  2. foo=1
  3. function foo(){}
  4. foo=2
  5. }
  6. console.log(foo)
  7. // Chrome Firefox Edge 打印 1
  8. // Safari 打印 2

debug

  1. console.log(foo)
  2. {
  3. debugger
  4. foo=1
  5. debugger
  6. function foo(){}
  7. debugger
  8. foo=2
  9. debugger
  10. }
  11. console.log(foo)

Chrome、Firefox、Edge 下能观察到执行完 function(){} 后全局的 foo 由 undefined -> 1,代码实际转换成如下:

  1. var foo;
  2. {
  3. function foo() {}
  4. foo = 1
  5. window.foo = foo
  6. foo = 2
  7. }
  8. console.log(foo)

而这段代码在 Safari 下跑结果不同但是符合直觉,转换成:

  1. function foo(){}
  2. {
  3. foo=1
  4. foo=2
  5. }
  6. console.log(foo)

拓展

function declaration
ECMA 262 块级函数声明相关规范