刚刚发现一个莫名其妙的javascript特性,求大神解释

刚发现一个莫名其妙的javascript特性,求大神解释

var foo = 1;
(function (){
    document.write(foo);   //undefined,也就是读不到 全局变量的 foo=1 的值
    var foo = 2;
    document.write('<br>');
    document.write(foo); // 2
})();

//-------------------------------------------
var foo = 1;
(function (){
    document.write(foo);   // 1,也就是读得到 全局变量的 foo=1 的值
})();

如上,请问为什么上面那种情况能读到全局变量的 foo,但读不到值。第二种情况却可以呢?
------解决思路----------------------
所以在第一个方法当中,两个foo是完全不相同的。
而第二个方法当中,因为在当前作用域找不foo这个变量,会慢慢往外面一层找,直到找到全局的foo,这时foo是叫做自由变量。如果找完全局都没有发现foo这个变量,那么就会在该方法里面自己创建一个变量,所以说js里面就算你不声明变量,只要使用了它会先往外层找,找不到了就在当前作用域自己创建。