当前位置:首页 > 前端开发 > 正文内容

JS 预编译代码实例剖析

邻居的猫1个月前 (12-09)前端开发1676

了解 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 目标,查找变量和形参,实参值和形参一致,查找函数声明。
  • 履行阶段:依照代码次序履行,变量赋值和函数调用。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=414

分享给朋友:

“JS 预编译代码实例剖析” 的相关文章

ThreeJs-02Threejs开发入门与调试

ThreeJs-02Threejs开发入门与调试

这两天没有上传笔记,在处理图床的问题,主打一个白嫖,所以要费点心思,先是用了gitee的图床十分困难配好后发现竟然加了防盗链,后边又转了github的咱现在来说github也是最安稳且免费的,但是有个问题,这玩意得用梯子才干看到,作为国内的博客谁随时挂个梯子上来,所以最终仍是用了收点费不是许多,但能...

vue导航栏, 导航栏的重要性

vue导航栏, 导航栏的重要性

Vue导航栏:构建高效且响应式的用户界面在Web开发中,导航栏是用户与网站交互的第一步,它不仅提供了访问网站不同部分的入口,还影响了用户体验的整体质量。Vue.js,作为一款流行的前端框架,提供了强大的工具来创建动态和响应式的导航栏。本文将深入探讨如何在Vue项目中实现一个高效且响应式的导航栏。...

html合并行,```html    合并表格行示例

html合并行,```html 合并表格行示例

在HTML中,合并行通常指的是将多个表格单元格(``)合并为一个单元格。这可以通过`colspan`属性来实现,该属性指定了单元格应该横跨多少列。以下是一个简单的例子,展示了如何合并表格中的行:```html 合并表格行示例 合并行单元格 单元格2...

html上传文件,```html    文件上传示例

html上传文件,```html 文件上传示例

要在HTML中上传文件,您可以使用``元素。这个元素允许用户选择文件并上传到服务器。以下是一个基本的示例:```html 文件上传示例 选择文件: 在这个例子中,``元素定义了一个表单,用户可以在其中上传文件。`action`属性指定了表单提交到服务器的URL(在这个例子中...

css的作用是什么,CSS的作用概述

css的作用是什么,CSS的作用概述

CSS(层叠样式表)是一种用于描述HTML或XML文档的样式的样式表语言。CSS的作用包括但不限于以下几点:1. 样式控制:CSS允许开发者对网页中的元素进行样式控制,包括颜色、字体、布局、间距等。通过CSS,开发者可以轻松地改变整个网站的外观,而不需要修改每个HTML元素的样式。2. 内容与样式分...

Vue是做什么的,什么是Vue.js?

Vue是做什么的,什么是Vue.js?

Vue是一个用于构建用户界面的开源JavaScript框架,它由尤雨溪在2014年发布。Vue的核心库只关注视图层,易于上手,并且能够扩展到大型项目的规模。Vue的设计目标是提供一个渐进式的框架,这意味着开发者可以根据自己的需求,逐步引入Vue的功能,而不必一开始就完全重构现有的代码库。Vue的一些...