变量提升:

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);

王超
42 声望1 粉丝

世间美好,与你环环相扣。