服务器之家:专注于服务器技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - js教程 - 一起来了解一下JavaScript的预编译(小结)

一起来了解一下JavaScript的预编译(小结)

2022-01-25 15:59前端布吉岛 js教程

这篇文章主要介绍了一起来了解一下JavaScript的预编译(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

JS运行三部曲

js运行代码共分三步

  • 语法分析
  • 预编译
  • 解释执行

JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内部的一个逻辑,最后再开始一行一行的执行代码

语法分析

代码在执行之前,系统会通篇扫描一遍,检查代码有没有低级的语法错误,比如少写个大括号。

预编译

预编译前奏

预编译发生在函数执行的前一刻。变量未经声明就赋值,此变量为全局对象所有

a = 3

var b = c = 4

一切声明的全局变量,全是window的属性

var a = 1 ===> window.a = 1

预编译四部曲

  1. 创建AO(Activation Object)对象(里面存储的是函数内部的局部变量)
  2. 找形参和变量声明,将变量和形参名做为AO属性名,值为undefined
  3. 将实参和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

用一个例子来说明一下,也可以自己先给出一个答案,再继续往下看

?
1
2
3
4
5
6
7
8
9
10
11
12
function fn(a) {
 console.log(a);
 var a = 123;
 console.log(a);
 function a() {}
 console.log(a);
 var b = function() {};
 console.log(b);
 function d() {}
 console.log(d)
}
fn(1);

第一步,创建AO(Activation Object)对象 {}第二步,找形参和变量声明,将变量和形参名做为AO属性名,值为undefined

?
1
2
3
4
{
 a: undefined,
 b: undefined,
}

第三步,将实参和形参统一

?
1
2
3
4
{
 a: 1,
 b: undefined,
}

第四步,找函数声明,值赋予函数体

?
1
2
3
4
5
{
 a: function a() {},
 b: undefined,
 d: function d() {}
}

所以在函数fn执行的前一刻,a、b、d的值如上所示

所以fn(1)执行的结果为

// ƒ a() {}
// 123
// 123
// ƒ () {}
// ƒ d() {}

在全局作用域里,预编译过程有些许不同

  • 创建GO(Global Object)对象(里面存储的是函数内部的全局变量)GO === window
  • 找形参和变量声明,将变量和形参名做为GO属性名,值为undefined
  • 在函数体里面找函数声明,值赋予函数体

解释执行

一行一行的执行代码

实践题

这里有几个例题,有兴趣的可以看一下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function test(a, b) {
 console.log(a);
 console.log(b);
 var b = 234;
 console.log(b);
 a = 123;
 console.log(a);
 function a() {}
 var a;
 b = 234;
 var b = function() {};
 console.log(a);
 console.log(b);
}
test(1);
?
1
2
3
4
5
6
7
8
9
global = 100;
function fn() {
 console.log(global);
 global = 200;
 console.log(global);
 var global = 300;
}
fn();
var global;
?
1
2
3
4
5
6
7
8
9
10
11
12
function test() {
 console.log(b);
 if (a) {
  var b = 100;
 }
 c = 234;
 console.log(c);
}
var a;
test();
a = 10;
console.log(c);

总结

多数情况下,我们都是采用下面的这种方式来处理预编译的一个过程

  • 函数声明,整体提升
  • 变量声明,声明提升

若是遇见复杂的情况就只能采用最原始的方式来解决问题了

到此这篇关于一起来了解一下JavaScript的预编译(小结)的文章就介绍到这了,更多相关JavaScript 预编译内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6933756598678454280

延伸 · 阅读

精彩推荐
  • js教程JavaScript this关键字的深入详解

    JavaScript this关键字的深入详解

    这篇文章主要给大家介绍了关于JavaScript this关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    JAVA_朴先生9062021-12-31
  • js教程js实现有趣的倒计时效果

    js实现有趣的倒计时效果

    这篇文章主要为大家详细介绍了js实现有趣的倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    搬砖大法4462022-01-04
  • js教程详解微信小程序「渲染层网络层错误」的解决方法

    详解微信小程序「渲染层网络层错误」的解决方法

    这篇文章主要介绍了详解微信小程序「渲染层网络层错误」的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    石璞东 | haha6312021-12-27
  • js教程微信小程序实现登录注册功能

    微信小程序实现登录注册功能

    这篇文章主要介绍了微信小程序实现登录注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    保护我方豆豆5402021-12-22
  • js教程javascript实现拼图游戏

    javascript实现拼图游戏

    这篇文章主要为大家详细介绍了javascript实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    过客尘烟4942022-01-12
  • js教程ES6的循环与可迭代对象示例详解

    ES6的循环与可迭代对象示例详解

    这篇文章主要给大家介绍了关于ES6的循环与可迭代对象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    疯狂的技术宅11542022-01-12
  • js教程JavaScript canvas实现跟随鼠标移动小球

    JavaScript canvas实现跟随鼠标移动小球

    这篇文章主要为大家详细介绍了JavaScript canvas实现跟随鼠标移动小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    清静清源10412022-01-20
  • js教程JS实现选项卡插件的两种写法(jQuery和class)

    JS实现选项卡插件的两种写法(jQuery和class)

    这篇文章主要为大家详细介绍了JS实现选项卡插件的两种写法:jQuery和class,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    南柯Seven12012021-12-22