zoukankan      html  css  js  c++  java
  • 面试必备-作用域、作用域链、预解析

    1.变量分为局部变量和全局变量,

    2.作用域:就是变量的使用范围;所以,作用域也分为局部作用域和全局作用域

    3.JS中没有块级作用域,也就是说:一对大括号{}定义的变量,这个变量可以在大括号外面使用

      栗子1:

      <script>
       while(true){
         var num = 10;
         break
       }
       console.log(num)   //10
      </script>

      栗子2:

      <script>
       {
         var num = 10;
       }
       console.log(num)   //10
      </script>

      栗子3:

      <script>
       if(true){
         var num = 10;
       }
       console.log(num)   //10
      </script>

    4.函数中定义的变量是局部变量

      <script>
       function f1(){
         var num = 10;
       }
       console.log(num)   //Uncaught ReferenceError: num is not defined
      </script>

    5.作用域链:变量的使用,从里向外,层层搜索,搜做到了就可以直接使用了

      栗子1:

      <script>
      var num = 10;         //作用域链:级别0
      function f1(){
        var num = 20;       //作用域链:级别1
        function f2(){
          var num = 30;     //作用域链:级别2
          console.log(num)
        }
        f2()
      }
      f1();       //30
      </script>

      栗子2:

      <script>
      var num = 10;         //作用域链:级别0
      function f1(){
        var num = 20;       //作用域链:级别1
        function f2(){
          // var num = 30;     //作用域链:级别2
          console.log(num)
        }
        f2()
      }
      f1();       //20
      </script>
    </body>

      栗子3:

      <script>
      var num = 10;         //作用域链:级别0
      function f1(){
        // var num = 20;       //作用域链:级别1
        function f2(){
          // var num = 30;     //作用域链:级别2
          console.log(num)
        }
        f2()
      }
      f1();       //10
      </script>

      栗子4:

      <script>
      // var num = 10;         //作用域链:级别0
      function f1(){
        // var num = 20;       //作用域链:级别1
        function f2(){
          // var num = 30;     //作用域链:级别2
          console.log(num)
        }
        f2()
      }
      f1();       //Uncaught ReferenceError: num is not defined
      </script>

    6.预解析:在浏览器解析代码之前,把变量的声明和函数的声明提前(提升到该作用于的最上面)

      划重点!!!变量提升,不提升赋值;函数提升,不调用函数!函数内部也有预解析执行过程

      <script>
        console.log(num)    //Uncaught ReferenceError: num is not defined;未定义报错
    
        console.log(num)    //undefined;定义了未赋值
        var num = 100      //预解析过程为:var num ; console.log(num); num=100;
    
        f1()
        function f1(){
          console.log("这个函数执行了")     //这个函数执行了
        }
        // 预解析过程为:function f1(){console.log("这个函数执行了")}; f1()
    
        f2();
        var f2 = function(){
          console.log("abc")    //Uncaught TypeError: f2 is not a function
        }
        // 预解析过程为:var f2; f2(); f2=function(){console.log("abc")}
        // 第二步中执行f2函数,但因为f2只是一个变量不是函数,所以报错:f2不是函数
      </script>

    经典面试题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    第一题:

      <script>
        f1();
        console.log(c)
        console.log(b)
        console.log(a)
        function f1() {
          var a = b = c = 9;
          console.log(a)  
          console.log(b)
          console.log(c)
        }
        // 9(19行) 9(20行) 9(21行) 
        // 9(14行) 9(15行) Uncaught ReferenceError: a is not defined(16行)
      </script>

    预解析过程:

     function f1() {
          var a = b = c = 9;   ===》等价于:var a = 9,b=9,c=9(a是var为当前函数内作用域,b、c无var全局作用域)
          console.log(a)  
          console.log(b)
          console.log(c)
        }
    f1();
     console.log(c)
     console.log(b)
     console.log(a)

    第二题:
      <script>
        f1();
        console.log(c)
        console.log(b)
        console.log(a)
        function f1() {
          var a = 9, b=9, c=9;
          console.log(a)  
          console.log(b)
          console.log(c)
        }
        // 9(19行) 9(20行) 9(21行) 
        //Uncaught ReferenceError: c is not defined(14行) 14行就开始出错了,其实a、b、c都是报这个错误
      </script>
    
    

    预解析过程:

     function f1() {
          var a = 9,b =9, c = 9;   ===》等价于:var a = 9,var b=9, var c=9(a、b、c是var为当前函数内作用域)
          console.log(a)  
          console.log(b)
          console.log(c)
        }
    f1();
     console.log(c)
     console.log(b)
     console.log(a)
    第三题:
      <script>
       var ppx = "x";
       function f1(){
         console.log(ppx);
         var ppx= "y"
         function ppx(){
           console.log(ppx)
         }
         console.log(ppx)
         ppx()
       }
       f1();
       //ƒ ppx(){console.log(ppx)} (15行)
       //y
       //1.html:21 Uncaught TypeError: ppx is not a function
      </script>

    预解析过程:

      var ppx;

     function f1(){
         var ppx;
         function ppx(){    //函数定义,但未调用,所以什么也不打印
           console.log(ppx)
         }
         console.log(ppx)    //打印上面的ppx函数
       ppx="y"          //ppx是一个变量,值为y,
       console.log(ppx)      //打印y
         ppx()            //报错!此时的ppx是变量而不是函数
       }
    ppx="x"
    f1();
     
  • 相关阅读:
    Heidisql导入导出SQL脚本
    递归遍历删除children为[]的children
    将v-model的值绑定到vuex中时遇到的问题及解决办法(computed替代watch)
    为什么不建议v-for和v-if一起使用
    vue全选和取消全选的实现方式(主要是理解computed中的set和get)
    全部设置为仅查看/可编辑【第三种方法:computed】
    全部设置为仅查看/可编辑【第二种方法:watch+methods】
    全部设置为仅查看/可编辑【第一种方法:watch】
    v-model的三个修饰符
    在表单元素上使用v-model的注意事项
  • 原文地址:https://www.cnblogs.com/yaya-003/p/12655736.html
Copyright © 2011-2022 走看看