前端(十二):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
    
目录
相关文章
|
10天前
|
缓存 前端开发 JavaScript
前端开发的必修课:如何让你的网页在弱网环境下依然流畅运行?
【10月更文挑战第30天】随着移动互联网的普及,弱网环境下的网页性能优化变得尤为重要。本文详细介绍了如何通过了解网络状况、优化资源加载、减少HTTP请求、调整弱网参数和代码优化等方法,提升网页在弱网环境下的加载速度和流畅性,从而改善用户体验。
87 4
|
8天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
8天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
13 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
13天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
19 1
|
14天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
14 1
|
17天前
|
前端开发 JavaScript UED
"前端小技巧大揭秘:JS如何将后台时间戳秒变亲切小时前、分钟前,让用户秒懂,提升互动体验!"
【10月更文挑战第23天】在Web开发中,将后台返回的时间戳转换为“小时前”、“分钟前”、“刚刚”等友好的时间描述是常见需求。本文介绍如何用JavaScript实现这一功能,通过计算当前时间和时间戳的差值,返回相应的描述,提升用户体验。
22 0
|
28天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
118 2
|
28天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
36 0
|
28天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
28天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。