一、第一种情况
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
原文:https://www.cnblogs.com/wyctf/p/11401288.html