变量晋升:

js代码再运行的时候,扫描所有的变量及函数,将其晋升在作用域的顶部。

不在函数外部的var定义的是全局变量,晋升到作用域顶部;
函数,讲整个函数体都晋升到作用域顶部;
如果函数是以定义变量赋值匿名函数的形式存在,那么不存在函数体晋升的状况。

优先级的比拟:

函数名和变量名抵触时,函数的优先级较高;全局变量和局部变量命名抵触时,部分作用域中,局部变量的优先级比拟高;参数的优先级大于变量晋升的优先级。

经典例题:

    var a = 1;    console.log(a); //1    console.log(b);  //undefined    var b = 1;    console.log(b); //1            console.log(a); //function a(){};    function a(){};    var a = 1;    console.log(a); //1            var fn = function(){        console.log('test');  //test    };    fn();        console.log(a); //undefined    var a = 1;    console.log(a); //1    var a = function(){};    console.log(a); //函数            var a = 1;    function fn(){        console.log(a);     //1        var b = 1;    }    fn();    console.log(b); //b is not defined            var a = 1;    function fn(){        console.log(b); //undefined        var b = 1;    }    fn();            var a = 1;    function fn(){        console.log(a); //undefined        var a = 2;    }    console.log(a); //1    fn();   //先是1,才是undefined            function sum(a){        console.log(a); //1        var a = 2;    }    sum(1);            function sum(a){        var a = 2;        console.log(a); //2    }    sum(1);