首页 > 其他分享 >JS 预编译代码实例分析

JS 预编译代码实例分析

时间:2024-11-29 22:21:29浏览次数:5  
标签:function console log fn1 AO JS 编译 实例 undefined

了解 JavaScript 引擎在执行代码过程中所做的一些行为是非常必要的,这有助于我们在遇到莫名其妙的调用时,能够大致定位问题所在。在我学习了预编译的相关知识,并基于该文章,引用其中的一段代码,结合“变量提升”、“函数提升”的小示例,对其进行详细的分析,算是留作一份笔记巩固记忆、加深理解。

代码

console.log(a)
fn1(1)
var a = 123
console.log(a)

var fn1 = () => {
  console.log(a)
}

function fn1(a) {
  console.log(a)
  var a = 666
  console.log(a)
  function a() {}
  console.log(a)
  var b = function () {}
  console.log(b)
  function c() {}
}

fn1(1)

错误的推导会让你认为上述代码的打印如下:

如果你判断首行报错,那么需要了解变量提升
或者你这样认为
undefined
undefined
666
[Function: a]
[Function: b]
123
undefined
666
[Function: a]
[Function: b]

实际上,上方的代码打印如下:

undefined
[Function: a]
666
666
[Function: b]
123
123

详细分析

1. 创建全局对象 GO

在全局执行上下文中,创建全局对象 GO

2. 加载当前 JS 文件

加载并解析当前的 JavaScript 文件。

3. 脚本语法分析

进行语法分析,确保代码没有语法错误。

4. 当前 JS 文件预编译

4-1. 查找变量声明
GO = {
  a: undefined
}
4-2. 查找函数声明(除了函数表达式)
GO = {
  a: undefined,
  fn1: function fn1(a) {}
}

5. 正常执行(执行到函数调用前)

console.log(a) // 打印 undefined
fn1(1) // 执行到这里了,小心,函数也有预编译,执行前一刻完成

6. 函数预编译

6-1. 创建活跃对象 AO
AO = {}
6-2. 查找变量和形参
AO = {
  a: undefined,
  b: undefined
}
6-3. 实参值和形参统一
AO = {
  a: 1,
  b: undefined
}
6-4. 查找函数(非函数表达式)
AO = {
  a: function a() {},
  b: undefined,
  c: function c() {}
}

7. 正常执行函数(根据 AO)

console.log(a)  // 打印 function a() {}
var a = 666  // a 改变,AO.a = 666
console.log(a)  // 打印 666
function a() {}  // 该声明已提升过,不会覆盖
console.log(a)  // 打印 666
var b = function () {}  // b 改变,AO.b = function () {}
console.log(b)  // 打印 function () {}
function c() {}  // 该声明已提升过,不会覆盖

8. 接着执行函数外代码,执行到下个函数调用前

fn1(1) // 已讲述,上续
var a = 123  // GO 对象中的 a 改变为 123(undefined > 123)
console.log(a)  // 打印 123

var fn1 = () => {  // fn1 改变,GO.fn1 = () => {...}
  console.log(a)
}

function fn1(a) {  // 该声明已提升过(函数提升),不会覆盖
  ...
}

fn1(1)  // 执行到这里时,预编译

9. 函数预编译

9-1. 创建活跃对象 AO
AO = {}
9-2. 查找变量和形参
AO = {
  a: undefined
}
9-3. 实参值和形参统一
AO = {
  a: 1
}
9-4. 查找函数(非函数表达式)
AO = {
  a: 1
}

10. 正常执行函数(根据 AO)

console.log(a)  // a 不存在当前函数作用域,往上级查找,找到 GO.a,打印 123

总结

  • 全局预编译:创建 GO 对象,查找变量声明和函数声明。
  • 函数预编译:创建 AO 对象,查找变量和形参,实参值和形参统一,查找函数声明。
  • 执行阶段:按照代码顺序执行,变量赋值和函数调用。

标签:function,console,log,fn1,AO,JS,编译,实例,undefined
From: https://www.cnblogs.com/gupingan/p/18577692

相关文章

  • Linux系统上使用nvm管理nodejs和npm版本操作
    安装nvm由于Github的访问性问题,所以我们不使用Github安装,而是使用Gitee安装,使用的Gitee仓库为:https://gitee.com/RubyMetric/nvm-cn安装命令为:bash-c"$(curl-fsSLhttps://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"安装后验证:重启shell或者执行source~/.nvm/n......
  • vue.js学习(day 13)
    .sync修饰符 App.vue <template><divclass="app"><button@click="isShow=true">退出按钮</button><!--:visible.sync=>:visible+@update:visible--><BaseDialog:visible.......
  • 271.大学生HTML5期末大作业 —【精美的响应式自适应绿色茶叶公司】 Web前端网页制作 h
    目录一、更多推荐二、网页简介三、网页文件四、网页效果五、代码展示1.html2.CSS3.JS六、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强一、更多推荐欢迎来到我的CSDN主页!您的支持是我创作的动力!Web前端网页制作、网页完整代码、大学生期末大作......
  • 轻松掌握 microTVM 编译步骤
    1引言在当今快速发展的机器学习领域,TVM已经成为了一个不可或缺的工具。尤其是MicroTVM,作为TVM的一个重要分支,它专注于在资源受限的微控制器上运行机器学习模型,这在物联网(IoT)和边缘计算的背景下显得尤为重要。MicroTVM的存在极大地推动了机器学习模型在更小、更省电的设备上的应......
  • Nuxt.js 应用中的 render:response 事件钩子
    title:Nuxt.js应用中的render:response事件钩子date:2024/11/29updated:2024/11/29author:cmdragonexcerpt:render:response是一个在Nuxt.js中与服务器端渲染(SSR)相关的钩子,它会在请求的响应发送之前被调用。这个钩子的目的是让开发者可以在响应发送之前对响应进......
  • ThreeJs-04详解材质与纹理
    一.matcap材质这个材质不会受到光照影响,但是如果图片本身有光就可以一直渲染这个图片本来的样子,用来将一个图片纹理渲染到物体上的材质代码实现加载模型后,开启纹理渲染,并把它的材质变为这个材质,并且贴上纹理图二.Lambert材质Lambert网格材质是Three.js中最基本和常用的材......
  • js和CSS3媒体查询制作简单的响应式导航菜单
    这是一款使用纯js和css3媒体查询制作的简单的响应式导航菜单效果。该导航菜单类似bootstrap导航菜单,它通过mediaquery制作760像素断点,当视口小于760像素时,菜单会收缩为隐藏的汉堡包菜单。在线演示 下载 使用方法 HTML结构该导航菜单使用<nav>元素最为包裹容器,div.menu_b......
  • 揭秘JSONP原理:跨域数据传输的魔法钥匙!
    JSONP(JSONwithPadding)是一种通过动态创建<script>标签来实现跨域请求的技术。它利用了浏览器允许从不同源加载JavaScript文件的特性,从而绕过同源策略的限制。JSONP原理客户端发起请求:客户端创建一个 <script> 标签,并将其 src 属性设置为包含回调函数名的URL。服......
  • 基于数据可视化+SSM+JSP的校园心理健康网站系统的设计与实现(供毕业设计、课程设计参考
    文章目录1.内容见下图2.详细视频演示3.系统运行效果介绍4.技术框架4.1前后端分离架构介绍4.3程序操作流程5.项目推荐6.成品项目7.系统测试7.1系统测试的目的7.2系统功能测试8.代码参考9.为什么选择我?10.获取源码1.内容见下图2.详细视频演示文章......
  • node.js毕设家庭财务管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于家庭财务管理系统的研究,现有研究主要以企业或大型机构的财务管理为主,专门针对家庭财务管理系统的研究较少。在国内外,虽然财务管理相关理论与系统开......