自执行函数变量提升问题

var foo='hello';
(function(foo){
console.log(foo);
var foo=foo||'world';
console.log(foo);
})(foo);
console.log(foo); 三次分别输出什么?
JS代码自上而下执行的时候,自执行函数不在进行变量提升,但是函数内部的变量提升还进行吗?food ||“world”改怎样理解?

等价于下面


    var foo = 'hello';
    (function (foo) {
        var foo = undefined;
        foo=//传入的foo的值
        console.log(foo);//hello
         foo = foo || 'world';//因为foo有值所以没有赋值world
        console.log(foo);//hello
    })(foo);
    console.log(foo);//hello,变量作用域,变量普通类型和引用类型的问题

。。》javascript运行机制浅析

http://www.w3dev.cn/article/20120830/javascript-runtime-parse.aspx