前端(十二):js预编译-js运行三步曲

简介: js预编译-js运行三步曲

js运行三步曲

  • (一).语法分析

    通篇扫描,检查是否有语法错误

  • (二).预编译(发生在函数执行的前一刻)
    • 预编译四步曲
      1.创建AO对象(执行期上下文)
        `AO {}`
      
      2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
        `AO{
            a: undefined,
            b: undefined
        }`
      
      3.将形参和实参统一
        `AO{
            a: 1,
            b: undefined
        }`
      
      4.在函数体里面找函数声明,值赋予函数体 (var b = function () { } 不是函数声明)
        `AO{
            a: function a() { },
            b: undefined,
            d: function d() { }
        } `
      
  • (三).解释执行
    function fn(a) {
         
      console.log(a) // function a() { }
      var a = 123;
      console.log(a) // 123
      function a() {
          }
      console.log(a) // 123
      var b = function () {
          }
      console.log(b) // function () { }
      function d() {
          }
    }
    fn(1)
    

    练习

  • 练习01:
    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: 3,
    //     b: 2,
    //     c: 0,
    //     d: function d(){}
    // }
    
  • 练习02:
    function test(a,b){
         
      console.log(a); // function a(){}
      console.log(b); // undefined
      var b = 234;
      console.log(b); // 234
      a = 123;
      console.log(a); // 123
      function a(){
         }
      var a;
      b = 456;
      var b = function(){
         }
      console.log(a); // 123
      console.log(b); // function(){}
    }
    test(1);
    // AO{
         
    //     a: function a(){} 
    //     b: undefined
    // }
    // AO{
         
    //     a: 123
    //     b: function(){}
    // }
    

    未经声明就赋值的变量归GO(window)所有

    // 练习01:
    console.log(b); // b is not defined.
    console.log(window.b); // undefined
    function test() {
         
      console.log(a); // undefined
      // console.log(b); // b is not defined.
      console.log(window.b); // undefined
      var a = b = 123;
      console.log(a, window.a); // 123 undefined
      console.log(b, window.b); // 123 123
    }
    test()
    // GO{
         
    //     b: undefined
    // }
    // AO{
         
    //     a: undefined
    // }
    
    // 练习02:
    console.log(test); // function test(test) { /* CODE */}
    function test(test) {
         
      console.log(test); // function test() { }
      var test = 123;
      console.log(test); // 123
      function test() {
          }
    }
    test(1);
    var test = 123;
    // GO{
         
    //     test: function test(test) { /* CODE */}
    // }
    // 1.test -> AO{}
    // 2.test -> AO{
         
    //     test: undefined
    // }
    // 3.test -> AO{
         
    //     test: 1
    // }
    // 4.test -> AO{
         
    //     test: function test() { }
    // }
    // 三、解释执行
    
    // 练习03:
    global = 100;
    function fn(){
         
      console.log(global); // AO里的 undefined
      global = 200; // 不是未声明
      console.log(global); // AO里的 200
      var global = 300;
      console.log(global); // AO里的 300
    }
    fn();
    var global;
    // GO{
         
    //     global: 100,
    //     fn: function fn(){
         /* CODE */}
    // }
    // AO{
         
    //     global: 300
    // }
    
    // 练习04:
    // 第一步.生成GO{
         
    //     a: undefined
    //     test: function test(){
         /* CODE */}
    // }
    // 第三步.执行函数改变GO{
         
    //     a: undefined
    //     test: function test(){
         /* CODE */},
    //     c: 123
    // }
    // 第四步.执行函数改变GO{
         
    //     a: undefined
    //     test: function test(){
         /* CODE */},
    //     c: 123
    // }
    function test() {
         
      console.log(a); // undefined
      console.log(b); // undefined
      if (a) {
         
          console.log(b); // undefined
          var b = 100;
          console.log(b); // 100
      }
      console.log(b); // undefined
      c = 123; // 第三步
      console.log(c); // 123
    }
    var a;
    console.log(c); // c is not defined.
    test();
    // 第二步.生成AO{
         
    //     b: undefined 
    // }
    console.log(c); // 123
    
    // 练习05:
    function bar(){
         
      return foo;
      foo = 10;
      function foo(){
         }
      var foo = 11;
    }
    console.log(bar()); // function foo(){}
    // AO{
         
    //     foo: function foo(){}
    // }
    
    // 练习06:
    console.log(bar()); // 11
    function bar(){
         
      console.log(foo); // function foo(){}
      foo = 10;
      console.log(foo); // 10
      function foo(){
         }
      console.log(foo); // 10
      var foo = 11;
      console.log(foo); // 11
      return foo;
    }
    // AO{
         
    //     foo: function foo(){}
    // }
    // AO{
         
    //     foo: 10
    // }
    // AO{
         
    //     foo: 11
    // }
    
    // 练习07:
    // GO{
         
    //     a: undefined,
    //     demo: function demo(e){
         /* CODE */}
    // }
    // 执行变化GO{
         
    //     a: undefined -> 100,
    //     demo: function demo(e){
         /* CODE */},
    //     -> f: 123
    // }
    a = 100;
    function demo(e){
         
      function e(){
         }
      arguments[0] = 2;
      console.log(e); // 2
      if(a){
         
          var b = 123;
          function c(){
         } // 在判断中定义函数相当于 c = function c(){} 
      }
      var c;
      a = 10;
      var a;
      console.log(b); // undefined
      f = 123;
      console.log(c); // undefined
      console.log(a); // 10
    }
    var a;
    demo(1);
    // AO{
         
    //     c: undefined,
    //     a: undefined,
    //     b: undefined,
    //     e: undefined
    // }
    // AO{
         
    //     c: undefined,
    //     a: undefined,
    //     b: undefined,
    //     e: 1
    // }
    // AO{
         
    //     c: undefined,
    //     a: undefined,
    //     b: undefined,
    //     e: function e(){}
    // }
    // 执行变化 -> AO{
         
    //     c: undefined,
    //     a: undefined -> 10,
    //     b: undefined,
    //     e: function e(){} -> 2
    // }
    console.log(a); // 100
    console.log(f); // 123
    // 最终结果:2 undefined undefined 10 100 123
    
目录
相关文章
|
3月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
6天前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
25 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
1月前
|
前端开发 应用服务中间件 nginx
docker安装nginx,前端项目运行
通过上述步骤,你可以轻松地在Docker中部署Nginx并运行前端项目。这种方法不仅简化了部署流程,还确保了环境的一致性,提高了开发和运维的效率。确保按步骤操作,并根据项目的具体需求进行相应的配置调整。
120 25
|
3月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
87 5
|
3月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
124 1
|
3月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
73 4
|
4月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
304 14
|
4月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
83 0
|
4月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。

热门文章

最新文章

  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    24
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    43
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    巧用通义灵码,提升前端研发效率
    84
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    137
  • 6
    详解智能编码在前端研发的创新应用
    92
  • 7
    智能编码在前端研发的创新应用
    75
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    111
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    73