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


    全局作用域 和 局部作用域(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

  • 相关阅读:
    Flutter——限制按钮点击的时间间隔
    【友盟】添加埋点事件(以iOS和安卓端为例)
    Git——在VSCode中查看Git历史提交记录
    Flutter——【好用网站】大集合
    Flutter——数组(List)
    Flutter——实现强大的输入框功能
    基于腾讯位置服务定位实现物业巡检防作弊场景
    基于腾讯地图定位组件实现周边公用厕所远近排序分布图
    腾讯位置服务Flutter业务实践——地图SDK Flutter插件实现(一)
    微信小程序类快递自动填写收发货地址功能
  • 原文地址:https://www.cnblogs.com/ndh074512/p/14680642.html
Copyright © 2020-2023  润新知