前端学习——02——js预编译过程详解易懂附代码

2023-11-06

目录

 一:预编译前奏

二:函数体系内的预编译

三:全局的预编译

四:例题


赋值一定是自右向左的,所以是先把123赋给b,再把b赋给a,b是未经声明的,所以全局能访问到b,a是局部变量所以访问不到

 

 

二:函数体系内的预编译

函数执行的前一刻生成AO,GO是一开始就有的

​
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
      <!-- //js运行三部曲

      一:语法分析
      二:预编译:发生在函数执行的前一刻
            预编译前奏:  window 就是全局的域
            1:imply global:暗示全局变量,即任何变量,如果变量未经声明就赋值,此变量就归全局对象所有,全局对象是window 如: a=10; ==> window.a=10;
            2:一切声明的全局变量(在函数中则不是全局变量),全是window的属性。注意:只有全局的才能归window所有,局部的不行
                var a=123;==>window.a=123;
            预编译四部曲:预编译发生在函数执行的前一刻
            1:创建AO对象 Activation Object(执行期上下文)  AO{}
            2:找函数里的形参和变量声明,将变量和形参名作为AO属性名,值为undefined AO{
                  例1: 
                  a:undefined
                  b:undefined
            }
            3:将实参值和形参统一  形参a变为1
            4:在函数体里面找函数声明。值赋予函数体  a和d都是函数声明 b是函数表达式
            


            以上四个步骤以例一为例   
               1:创建AO作用域
               AO{
                     
               }
               2:AO{
                       a:undefined
                       b:undefined
               }
               3:AO{
                     a:1;
                     b:undefined
               }
               4:AO{
                     a: function a(){}
                     b:undefined
                     d: function d(){}
                     
               }
         
//函数声明是 funtion b(){}
//函数表达式是 var b=funtion (){}
//函数声明整体提升: 函数声明不管写到哪里,系统总是会把函数提到逻辑最前面
//变量 声明提升 :赋值不提升,var a会提到前面(预编译执行),就是预编译过程中var a的声明已经看过了。
                 但是赋值是在解释执行的时候赋值的。解释执行时不再看预编译的内容
       三:解释执行  -->
<script type="text/javascript">
       //解释执行代码
      
      //例1:
       function fn(a){
             console.log(a);//输出function a(){}
              var a=123;
              //AO{
            //           a:123
            //          b:undefined,
            //          d:function d(){}

            //  }
             console.log(a);//输出123
             function a(){}//预编译已经看过的地方不再看了
             console.log(a);//输出123
             var b=function (){}//预编译已经看过的地方不再看了
              //AO{
            //           a:123
            //          b:function (){}
            //          d:function d(){}

            //  }
             console.log(b);//输出function (){}
             function d(){}
       }
       fn(1);


       //例2:
       function test(a,b){
             console.log(a);//1
             c=0;
             var c;
             a=3;
             b=2;
             console.log(b);//2
             function b(){}
             function  d(){}
             console.log(b);//2
       }
       test(1);
       //第二步
      //  AO{
      //        a:undefined
      //        b:undefined
      //        c:undefined
      //  }
       //第三,四步:
      //  AO{
      //        a:1
      //        b:function b(){}
      //        c:undefined
      //        d:function d(){}
      //  }
       
      // 例3:
      function test(a,b){
            console.log(a);//function (){}
            console.log(b);//undefined
            var b=234;
            console.log(b);//234
            a=123;
            console.log(a);//123
            function a(){}
            var a;
            b=234;
            var b=function(){}
            console.log(a);//123
            console.log(b);//function(){}
      }
      test(1);
      
     
</script>
</head>
<body>
    
</body>
</html>

​

三:全局的预编译

未经声明的变量都会提升到全局变量

 

 

<!DOCTYPE html>
<html lang="en">
<head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <!-- 
            例1:生成了一个GO对象Global Object
           除了没有实参形参,其他步骤和函数体系内预编译过程是相同的
      GO{
              a:undefined->function(){}
        }  
        GO===window
      -->
        
  <!-- 例1:生成了一个GO对象Global -->
    <script>
          var a=123;
          function a(){} 
          console.log(a);
    </script>
    <!-- //例2: -->
    
    <script>
      //     GO{
      //            b:123;
      //     }
          function test(){
                var a=b=123;//没有声明b,从右至左顺序执行的
                console.log(b);
          }
          test();
      //     AO{
      //           a:undefined
      //     }
    </script>

      <!-- 例3: -->
<script>
      // GO{
      //       test:undefined->函数体function test(test){...}
      // }
           console.log(test);//输出function test(test){...}
           function test(test){//提升了不看了,下一步执行函数再创建AO再执行这里
            console.log(test);//输出function test(){}
             var test=234;
             console.log(test);//输出234
             function test(){}
             }     
             test(1);
             var test=123;
      //     AO{
      //           test:undefined->1->function test(){}
      //     }
   
</script>
                     <!-- 例4: -->
             <script>
                  //  GO{
                  //        global:undefined          GO{ 
                  //                                     global:100
                  //                            ->       fn:function fn(){...}
                  //   }                               }
                         
                   
                   var global=100;
                   function fn(){
                         console.log(global);//先上AO上找,没有,再去GO上找
                   }
                   fn();
                  //  AO{
                  //       空的

                  //  }
             </script>


                   <!--例5  -->
                   <script>
                        //  GO{
                        //        global:undefined
                        //        fn:fn(){}
                        //  }
                         global=100;
                         function  fn(){
                               console.log(global);//undefined 先找自己AO的
                               global=200;
                               console.log(global);//200
                               var global=300;
                         }
                         fn();
                         var global;
                        //  AO{
                        //        global:undefined

                        //  }

                   </script>

                   <!-- 例6 -->
                  <script>
                        // GO{
                        //       a:undefined
                        //       test:function test(){...}
                        //       c:234
                        // }
                        function test(){
                              console.log(b);//undefined error
                              if(a){ //a=undefined
                                    var b=100;
                              }
                              console.log(b);//undefined
                              c=234;//AO里面没c,添加到GO里去
                              console.log(c);//234
                        }
                        var a;
                        test();//调用函数时开始创建AO
                        // AO{
                        //       b:undefined  不用管if if里的判断不管怎样,都会变量提升
                              
                        // }
                        a=10;
                        console.log(c);//234
                        
                  </script>

                  <!-- 百度笔试题1 -->
                    <script>
                        // GO{
                        //      bar:function bar(){...}

                        // }
                        function bar (){
                              return foo;//相当于console.log(foo)
                              foo=10;
                              function foo(){

                              }
                              var foo=11;
                        }
                        console.log(bar());//foo(){...}
                        // AO{
                        //       foo:foo(){}
                              
                        // }
                  </script>

                   <!-- 百度笔试题2 -->
                   <script>
                        // GO{
                        //       bar:function bar(){...}
                        // }
                        console.log(bar());
                        function bar()
                         {
                               foo=10;
                               function foo(){

                               }
                               var foo=11;
                               return foo;//相当于console.log(foo)
                           }
                           
                        //    AO{
                        //          foo:foo(){}
                        //    }
                   </script>

            <!-- 例7 -->
              <script>         
                 console.log(b);//undefined  b是函数表达式,不是函数
                 var b = function () {}
              </script>

                   <!-- 例8 -->
                   <script>
                        // GO{
                          //       a:undefined->100
                        //       demo:demo(){...}
           
                       //        f:123
                        // }
                         a=100;//a:undefined->100
                         function demo(e){
                               function e(){}
                               arguments[0]=2;//e=2  arguments控制实参,实参第一位改成2
                               console.log(e);//输出2
                               if(a){//a=undefined 不执行if语句
                                     var b=123;
                                     function c(){//if里面不能声明function,在这里只作为练习

                                     }
                               }
                         
                         var c;
                         a=10;
                         var a;
                         console.log(b);//输出undefined
                         f=123;//AO里面没f,添加到GO里去
                         console.log(c);//输出undefined
                         console.log(a);//输出10
                         }
                         var a;
                         demo(1);
                        //  AO{
                        //        e:undefined->1->function e(){}->2
                        //        b:undefined
                        //        c:function c()/undefined
                        //        a:undefined->10
                        //  }
                         console.log(a);//输出100, 全局变量看GO里的
                         console.log(f);//输出123
                   </script>

               
</head>

<body>

      
</body>
</html>

四:例题

1.

 <script>
    /*
    GO{
      a:undefined=>100
      demo:function(){}
      f:un=>123
    }
    */
    a = 100;

    function demo(e) {
      function e() {}
      arguments[0] = 2; //形参列表第一个  和实参相映射 所以e变成2
      console.log(e); //2
      if (a) {//预编译时不看if里的条件,直接将if里的变量放进AO,执行时看if里的条件是否满足,由于a=undefined,所以不执行里面的语句
        var b = 123;

        function c() {}
      }
      var c;
      a = 10;
      var a;
      console.log(b); //un
      f = 123;//AO没有,放进GO里
      console.log(c); //function  由于新语法 函数不能定义再if语句里,所以这里实际打印出来的值时undefined
      console.log(a); //10
    }
    var a;
    demo(1);
    console.log(a); //全局里的a  100
    console.log(f); //123
    /*
    AO{
     e:un=>1=>function=>2
     b:un
     c:function
     a:un=>10
    }
    */
  </script>

2.

 <script>

   function print(){
     console.log(foo);//undefined
     var foo=2;
     console.log(foo);//2
     console.log(hello);//报错
   }
   print()
 
  </script>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端学习——02——js预编译过程详解易懂附代码 的相关文章

随机推荐

  • 服务器配置openssl支持 https 访问

    一 Windows apache 下 软件是xampp 说明 部分参考 http blog sina com cn s blog 5d7dbbdd0101042n html 首先要载入 mod ssl 1 将证书生成的配置文件 http t
  • MFC---CComboBox控件添加字符串函数InsertString

    InsertString 在列表的指定位置插入一项 需使用成员函数InsertString 函数有两个参数 第一个参数为索引号 设定为 1时 项目条被插入到列表的末尾 第二个参数与AddString 函数的唯一参数相同 为代表项目条中内容的
  • python中字典考题_python 字典一些常见的魔法方法以及遇到的面试题

    一 字典介绍 dict 类型不但在各种程序里广泛使用 它也是 Python 语言的基石 模块的命名空间 实例的属性和函数的关键字参数中都可以看到字典的身影 跟它有关的内置函数都在 builtins dict 模块中 正是因为字典至关重要 P
  • 对标大厂标准,C站(CSDN)软件工程师能力认证正式上线

    2021年3月1日 中国专业IT开发者社区CSDN 以下简称C站 正式推出 C站软件工程师能力认证 该认证与国际标准接轨 面向全球IT开发者学习成长 同时具备标准全开源 系统化学习 真实业务场景 完全上机实操 所有过程留痕 存档不可篡改等特
  • 【Leetcode】61. 旋转链表

    题目描述 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 题解 旋转链表 找倒数第k个节点 翻转前后链表 执行用时 0 ms 在所有 Java 提交中击败了100 00 的用户 内存消耗 37 8 MB 在所有
  • 重磅, GPT 4.0 API 全面开放使用!普通人也能用上 4.0 了 !

    伴随着人工智能领域的迅猛发展 GPT 4 0作为一款关键的智能模型 备受国内开发者和企业的瞩目 本文旨在为您提供详实的指南 帮助您在国内顺利获取并使用GPT 4 0 API 从而踏上智能应用创新之路 我们将为您提供一步一步的操作步骤和必要的
  • 【ts】数组、联合数据类型、类型推论

    一 ts约束数组 1变量 类型 let arr Number 1 3 3 4 arr push 1 arr push he 不能添加数组中没有约束的类型 2 数组泛型 变量 Array lt 类型 gt let arr Array
  • DasViewer加载大疆智图、CC等三维模型无空间坐标的解决方法

    对于大疆智图处理生成的terra osgbs文件夹下的三维模型包含了带有空间参数的metadata xml文件 利用DasViewer打开Model osgb模型文件 显示比较模糊 不能够达到实际应用的目的 我是利用转格式工具进行格式转换生
  • python 执行js脚本报错CryptoJS is not defined

    直接在js代码加上一行定义CryptoJS就行了 function encrypt e const CryptoJS require crypto js var b bGVhcm5zcGFjZWFlczEyMw var a new Base
  • 【Spring实战】—— 7 复杂集合类型的注入

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 之前讲解了Spring的基本类型和bean引用的注入 接下来学习一下复杂集合类型的注入 例如 List Set Map等 对于程序员来说 掌握多种语言是基本的技能 我们这里
  • 在本地以Docker方式安装和运行Kafka

    文章目录 在本地以Docker方式安装和运行Kafka 前言 用Bitnami kafka的镜像 用wurstmeister kafka的镜像 启动Kafka 测试创建主题并读 写消息 参考文档 后记 在本地以Docker方式安装和运行Ka
  • discuz7.2漏洞分析

    一 参数的入口 这段话的意思时遍历三种提交的方法 获取参数传递的值 有一个函数是daddslashes 跟进看一下 这段代码的意思是对数据里的每一个字符都进行转义处理 二 漏洞产生的代码在faq php195行 跟进implodeid函数
  • Tomcat安装测试、Eclipse配置Tomcat步骤

    一 安装tomcat并测试 1 1 1到Apache Tomcat官网下载安装包 在选择中间位置的版本较为稳定然后选择对应操作系统的安装包 本次选择8 5版本 1 1 2 解压下载好的安装包即可完成安装 复制Tomcat的安装路径以备下一步
  • 第十七章 C# Action和Func委托 多播 匿名函数 lambda表达式

    一 使用 Action和Func委托 方法的返回类型 和 名字千千万万 无法对每个方法都去定义对应的委托 nt为了方便使用委托 定义了两个泛型委托 Action Action委托表示一个void返回类型的方法 例1 MyDelegate m
  • 数据库内核杂谈阅读笔记

    数据库内核杂谈 InfoQ 文章目录 简单数据库实现 存储 索引优化 执行模式 Parsing Binding Optimizing Executing 排序和聚合 排序 聚合 JOIN 优化器 Query Rewrite Heuristi
  • 监控利器Nagios之一:监控本地NFS和外部HTTP、MySQL服务

    监控利器Nagios之一 监控本地NFS和外部HTTP MySQL服务 Nagios是一款开源的免费网络监视工具 能有效监控Windows Linux和Unix的主机状态 交换机路由器等网络设置 打印机等 在系统或服务状态异常时发出邮件或短
  • 深入学习jquery源码之attr()与removeAttr()

    深入学习jquery源码之attr 与removeAttr attr name properties key value fn 概述 设置或返回被选元素的属性值 参数 name String 属性名称 properties Map 作为属性
  • xml格式标签转为txt格式标签

    xml格式标签转为txt格式标签用于yolo目标检测 xml gt txt coding utf 8 import xml etree ElementTree as ET import pickle import os from os im
  • python实战:read,write读写,json文件读写

    1 read write 读写文本文件 基本操作 一 件的种类 1 本 件 可以使 本编辑软件查看 例如 python 的源程序 txt 文本文件等 2 二进制 件 保存的内容不是给 直接阅读的 是提供给其他软件使 的 例如 图 件 频 件
  • 前端学习——02——js预编译过程详解易懂附代码

    目录 一 预编译前奏 二 函数体系内的预编译 三 全局的预编译 四 例题 赋值一定是自右向左的 所以是先把123赋给b 再把b赋给a b是未经声明的 所以全局能访问到b a是局部变量所以访问不到 二 函数体系内的预编译 函数执行的前一刻生成