变量的作用域

变量的作用域:变量使用的范围,一般包括全局,局部和块级作用域。根据定义的位置来判断作用域类型

1、局部变量

局部变量就是定义在函数内部的变量,这个变量只能在函数内部使用,即作用域范围只是函数内部,对于该函数里面的函数而言,该函数的变量也是他的“小全局变量”,在外部调用改变量就会出错,undenfined;函数的形参也是局部变量,只能在当前函数被使用。


function fn01(){
    fn02();
    console.log(a);a为fn02的局部变量,所以为undenfined
}

function fn02(){
    var a = 100;局部变量,
    console.log(a);


2、全局变量

全局变量就是定义在函数外部的变量,这个变量在任何函数中都有效,即作用域范围是当前文件的任何地方。不但在任何函数中都可以使用,而且值是公共的。即A函数改变值后,B函数拿到的就是改后的值。全局变量外面没函数可以理解为window的属性,函数为window的方法

var global_num = 25;
 function fn01(){    
global_num = 10;
   console.log("global_num);//10
   fn02();
} 
function fn2(){    
console.log(global_num);10
}

在函数内部使用的是局部变量,这叫就近原则


var age = 250; function fn(){    var age = 100;    console.log("fn里:age",age);100,就近原则。 }


全局变量的是使用场景

当在若干个函数里使用同名变量g,并且,A函数中改了g的值,B函数中要使用改后的值,使用全局变量。如果,A函数中改了g的值,如果其它函数中并不使用A函数更改后的值,不需要定义成全局变量。

变量的声明提升

在预编译阶段,声明的变量,总是会被提升,提升到变量的作用域的顶端(如:函数体的顶端)。

1、声明的变量会被提升作用域范围的顶端。


function fn(){
           
           console.log(a);
           var a ;
       }
   
        预编译阶段:会把以上代码中 var a ,提升到函数体的第一行。即:在编译之前,以上代码,会被处理成:
   
       function fn(){
           var a;
           console.log(a);
       }


2、提升的只是声明,不提升赋值。


function fn(){
        console.log(a);
        var a = 100;定义(声明)变量,并且赋值;        
    }

    预编译后,以上代码被改为:

    function fn(){
        var a;
        console.log(a);
        a = 100;定义(声明)变量,并且赋值;        
    }


变量赋值并没有被提升,只是声明被提升了。所以有些看着逻辑正常的代码在预编译阶段声明提升后就会呈现undenfined的情况

3)、当全局变量和局部变量重名并且碰到了声明提升


var age = 250;
function fn(){
    console.log(age);250,undefined。
    var age = 100;
    console.log(age);100
}
如果按原本代码分析有可能就会忘记声明提升,在不调试的情况下判断为250

 以上代码经过预编译后,成为以下代码:

var age = 250;
function fn(){
    var age;
    console.log(age);undefined;
    age = 100;
    console.log(age);100
}