全局变量和局部变量练习题

全局作用域 和 局部作用域(ES6之前)

全局作用域:整个script标签 或者是一个单独的js文件;

局部作用域:在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用;

注意: 全局作用域和局部作用域如果命名相同是不会相互影响的;

全局变量和局部变量

变量的作用域: 根据作用域的不同我们变量分为全局变量和局部变量

  1. 全局变量: 在全局作用域下声明的变量,在全局下都可以使用

  2. 局部变量: 在局部作用域下声明的变量,只能在函数内部使用

全部变量和局部变量练习题

1、

 1 <script>
 2         var a = 10;
 3         function test() {
 4             var b = 100;
 5             console.log(a);
 6             a=100;
 7         }
 8         test();
 9         console.log(a); 
10         console.log(b);
11     </script>

答案解析:打印结果:10 - 100 - 报错 ,因为a是全局变量,在函数内部是可以调用的,然后在函数内部又将a的值更改为100,所以在全局输出的log的值为100,但是b属于局部变量,只能在函数内部执行,所以最外面无法调用所以报错;

2、

 1 <script>
 2          var a = 1;
 3          function test(a) {
 4               a = 100;
 5               console.log(a);
 6               return a;        
 7           }
 8          test(a);
 9          //a = test(a);
10          console.log(a);
11     </script>

答案解析:打印结果:100 1,全局变量a 和 函数的形参a重名,函数的形参也是局部变量,所以函数里面的a的值是影响不到我们全局变量的,所以第一个log输出的值应该是局部变量a的值,第二个log输出的值还是全局的1;

 

作用域链(函数嵌套中变量的使用)

定义:

内部函数访问外部函数的变量,采取的是链式查找的方式来决定哪个值;

访问变量的时候,某个作用域中没有该变量,就会依次向上访问上层作用域中的变量 ---- 也就是就近原则;

 

预解析

定义:

JS引擎会把当前作用域中的var和function提升到当前作用域的最前面执行;

分为变量预解析(变量提升)和函数预解析(函数提升)

变量预解析(变量提升)--- 只提升声明不提升赋值

把当前作用域中的声明变量提升到当前作用域最前面执行,但是只能提升声明,不能将赋值也提升;

数预解析(函数提升)---- 只提升声明不调用

把当前作用域中函数声明提升到当前作用域的最前面执行,但是不调用函数;

 1 <script>
 2       var a = 10;
 3       function max(a) {
 4         a = 100; //此处的a为局部变量  因为形参为局部变量  虽然传过来了实参 但是 局部变量形参又重新赋值了
 5         b = 1000; //此处的b为函数内部全局变量 b=1000
 6         console.log(a); //打印的是形参局部变量a=100
 7         console.log(b); //打印的是函数内部的全局变量b=1000
 8         return a;
 9       }
10       var re = max(a); // 接受返回值a 又重新赋值给了re
11       console.log(re); //这个re打印的是 函数的返回值a
12       console.log(a); //这个a打印的是 全局变量最上面的a
13       console.log(b); //这个b打印的是 函数内部的全局变量b
14     </script>
 1  //   变量提升练习题
 2       var num = 1;
 3       function demo() {
 4         console.log(num);
 5         function demoSon() {
 6           num = 3;
 7         }
 8         var num = 2;
 9         demoSon();
10       }
11       demo();

 //变量和函数提升后  
1
/* var num; 2 function demo() { 3 var num; 4 function demoSon() { 5 num = 3; 6 } 7 console.log(num); //uedefined 8 num = 2; 9 demoSon(); 10 } 11 num = 1; 12 demo(); */
var a = 123;
function fun(){
    console.log(a);//123
    a = 456;
}
fun();
console.log(a);//456

函数内部的 a 为全部变量     所以函数外面打印的a为函数内部的全局变量   

函数内部的第一个打印a 函数内部没有 在函数外面的全局变量里找  找到了 全局变量a=123  所以打印123

原文地址:https://www.cnblogs.com/ndh074512/p/14680642.html