JS中的变量提升

由于JS引擎的工作方式,是先获取所有被声明的变量再逐一执行,所以变量的声明语句都会被提升到当前代码块的头部。

例1:

        var a = 1;
        function test1(){
            alert(a);
            var a = 2;
            alert(a);
        }
        test1();//undefined,2

输出结果是undefined,2,并不是1,2,实际执行顺序:

    var a = 1;
    function test1() {
        var a; //变量提升,先声明a(当局部变量与全局变量重名时,局部变量优先级高于全局变量,所以会覆盖全局变量,此时的a只有声明却未定义)
        alert(a);//所以执行alert值为undefined
        a = 2;
        alert(a);//此时a=2
    }
    test1();

例2:

        function test2() {
            alert("before for scope:" + i); //不会报错,undefined,变量提升i已声明未赋值

            for (var i = 0; i < 3; i++) {   //for不存在作用域之说
                alert("in for scope:" + i);  // i的值是 0、1、2, 当i为3时跳出循环
            }
            alert("after for scope:" + i);  // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3

            while (true) {
                var j = 1;
                break;
            }
            alert(j);    // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1

            if (true) {
                var k = 1;
            }
            alert(k);  //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
        }
        test2();
        alert(i); //此处报错,i指的是全局变量,is not defined(未定义),程序中断

注意:

1.当局部变量与全局变量重名时,局部变量优先级高于全局变量,所以会覆盖全局变量;

2.全局变量是指在函数外定义,全局可访问;局部变量是指函数内定义,外部不能正常访问;

3.函数作用域是指function的作用域,像if/while等并没有作用域;

4.is not defined是指变量未定义(未声明),undefined则是指变量已经声明但可能未赋值等其他原因;

5.undefined不影响运行,is not undefined会直接报错,中断运行;

6.在函数内部定义变量时,如果不加var而是直接如i = 1这种,实际相当于定义了一个全局变量;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值