js变量范围与声明提升

变量的作用域

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

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值