js中变量的作用域问题

一、第一种情况

1         var num = 100; 
2         function demo() {
3             var num = 101; 
4             console.log(num); //1.先在同级作用域里找num变量,找到了便执行,所以执行结果是101
5         }
6         demo();     

二、第二种情况

 1         var num = 100; 
 2         function demo() {
 3              console.log(num);     //1.同级作用域里有num,且num在预解析的过程中提升,详情附后
 4              var num = 101; 
 5         }
 6         demo(); 
 7         
 8             //预解析详情:
 9             //function demo() {
10             //    var num;            //2.变量的提升只会提升变量名,不会提升变量值
11             //    console.log(num);     //3.此时执行的变量还没有赋值 所以输出结果是undefined
12             //    num = 101; 
13             //}
14         

三、第三种情况

 1         var num = 100;        //1.首先进行函数和变量的提升,详情附后
 2         function demo() {
 3             var num = 101; 
 4         }
 5         demo();                    
 6         console.log(num);         
 7         
 8             //预解析详情:
 9             //function demo() {        //2.函数和变量提升时,函数优先
10             //var num = 101; 
11             //}
12             //var num;
13             //num=100;
14         
15             //demo();                //3.此时函数调用执行的num是局部变量,即101
16             //console.log(num);     //4.此时全局变量num覆盖了局部变量,所以输出100

四、第四种情况

 1         var num = 100;             //1.首先进行函数和变量的提升,详情附后
 2         function demo() {
 3             num = 101; 
 4         }
 5         console.log(num);
 6         demo();
 7         console.log(num);
 8         
 9             //预解析详情:
10             //function demo() {        //2.函数和变量提升时,函数优先
11             //    num = 101; 
12             //}
13             //var num;
14              //num = 100;
15             //console.log(num);        //3.此时输出的是全局变量100
16             //demo();                    //4.此时执行局部变量,所以num为101
17             //console.log(num);        //5.由于局部变量没有重新定义,所以调用时会更改全局变量的值
18                                 //5.所以此时输出的num为 被局部变量值更改过的全局变量 即为101*/


五、第五种情况

1         function demo() {
2             num = 11;
3         }
4         demo();        //1.此时num等于11
5         console.log(num);    
6         //当demo执行时,num没有定义,会现在当前作用域查找有没有定义,没有就向上级中,直到找到,或者到达全局中还未找到,此时他会自动var num;
7         //所以当console执行时,它已经定义好了且num=11;

 、、、拓展:若全局变量未定义,会不会报错

            //第一种情况:先赋值 再输出
            num = 101;         //此时虽然没有定义,但js会默认给你加上一个var
            console.log(num);

            //第二种情况:先输出 再赋值
            console.log(num);    //此时有没有num=101这条代码 效果都是num is not defined
            num = 101;                    
            //因为num首先会在同级作用域,且在执行的代码之前找变量有没有定义 没有就向上级找,发现也没有,所以出现num is not defined    

猜你喜欢

转载自www.cnblogs.com/wyctf/p/11401288.html
今日推荐