原题
{
foo=1
function foo(){}
foo=2
}
console.log(foo)
// Chrome Firefox Edge 打印 1
// Safari 打印 2
debug
console.log(foo)
{
debugger
foo=1
debugger
function foo(){}
debugger
foo=2
debugger
}
console.log(foo)
Chrome、Firefox、Edge 下能观察到执行完 function(){} 后全局的 foo 由 undefined -> 1,代码实际转换成如下:
var foo;
{
function foo() {}
foo = 1
window.foo = foo
foo = 2
}
console.log(foo)
而这段代码在 Safari 下跑结果不同但是符合直觉,转换成:
function foo(){}
{
foo=1
foo=2
}
console.log(foo)