广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中的预编译如何进行
  • 674
分享到

JavaScript中的预编译如何进行

2024-04-02 19:04:59 674人浏览 独家记忆
摘要

本篇内容介绍了“javascript中的预编译如何进行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!&nb

本篇内容介绍了“javascript中的预编译如何进行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

 前言

预编译,顾名思义就是是做些代码文本的替换工作。是整个编译过程的最先做的工作。JavaScript 的圣经 —— MDN 明确地说过, JavaScript  是一个解释型语言,而并非编译型语言,所以预编译对于js来说是子虚乌有的。但是人们喜欢称之为预编译其实也无伤大雅,关键在于为什么人们会认为JS存在预编译,是JS的哪种行为让人们觉得它产生了预编译呢?让我们来简单聊一聊。

引入

在代码执行前,编译器会进行如下操作:

一 parse阶段

分词。就是将代码分成原子符号(token)

将token解析翻译成AST(语法生成树)。

二 analyze阶段

遇到声明语句,将会把声明传到作用域(scope)中创建绑定,分配内存并将变量默认设为undefined或函数体。

然后就可以执行代码啦,执行中途每次遇到赋值或者取值,都会从作用域中查找绑定。这样看,是不是有点“预编译”内味了?但是实际上还是称它为预处理更加贴切一点。接下来,让我们来了解一波看起来最像预编译的操作--第三步的干货。

“预编译”

我的老师在和我讲相关知识点前和我说过这么一个笑话:

面试时我因为这么一个问题挂了

var a = 100 function foo(){     console.log(a) } foo()

问:为什么输出a的值是100?

答:因为100赋值给了a。

老师说完我头昏脑涨,完全不明白笑点在哪,后来才知道这是在考察“预编译”这方面的知识。

总的来说,“预编译”可以分为

创建Go对象(global object) 发生在页面加载完成时

创建AO对象(activation object) 发生在函数执行前一刻

具体步骤如下:

全局预编译

1. 创建GO对象

2. 找变量声明,将变量声明作为GO对象的属性名,并赋值undefined

3. 找全局里的函数声明,将函数名作为GO对象的属性名,值赋予函数体

局部预编译

1. 创建一个AO对象

2. 找形参和变量声明,将形参和变量声明作为AO对象的属性名,值为undefined

3. 将实参和形参统一

4. 在函数体里找函数声明,将函数名作为AO对象的属性名,值赋予函数体

所以那个笑话里的面试问题我们应该这么回答:

首先,编译器创建一个GO对象

找到变量声明 var a

和函数声明 function foo(){}

将上面两个变量声明作为GO的属性名赋初值

GO{

a:undefined

foo:function(){}

}

然后运行第一行代码 a=100

在GO中将100赋值给a

再执行第五行代码运行foo函数

创建一个AO对象

在函数体内找变量声明和形参,(无)

再在函数体内找函数声明(无)

所以

AO{

}

完成后运行第三行代码,输出a

先在AO对象中寻找a的值,发现不存在,向外部作用域扩展,在GO对象中寻找a,发现a的值为100

输出100

当然,笑话里的题过于简单,但是能让我们清晰的了解到这个“预编译”的进行

下面,我们来看一道面试题简化版,练练手:

global = 100     function fn() {       console.log(global);        global = 200       console.log(global);        var global = 300     }     fn()

它的逻辑和输出结果是多少呢?通过一步步的分析我们可以知道具体的分析应该是这样的:

GO: {       global: undefined => 100,       fn: function() {}     }     global = 100 // 没有声明的变量默认为全局变量,也会放到GO中     function fn() {       console.log(global); // 输出undefined       global = 200       console.log(global); // 输出200       var global = 300     }     AO: {       global: undefined => 200 => 300     }     fn()

“JavaScript中的预编译如何进行”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: JavaScript中的预编译如何进行

本文链接: https://www.lsjlt.com/news/71025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中的预编译如何进行
    本篇内容介绍了“JavaScript中的预编译如何进行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!&nb...
    99+
    2022-10-19
  • JavaScript中预编译的示例分析
    小编给大家分享一下JavaScript中预编译的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JavaScript 预编...
    99+
    2022-10-19
  • javascript中预编译指的是什么意思
    这篇文章将为大家详细讲解有关javascript中预编译指的是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在JavaScript中...
    99+
    2022-10-19
  • 如何使用java编译器进行编译
    使用Java编译器进行编译可以通过以下步骤:1. 确保已经安装了Java Development Kit (JDK)。可以通过在命令...
    99+
    2023-09-06
    java
  • 如何进行SQLite编译
    这期内容当中小编将会给大家带来有关如何进行SQLite编译,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。上周,我一直在做一个 SQL 网站。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例...
    99+
    2023-06-16
  • java如何进行反编译
    反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。Java常用反编译工具本...
    99+
    2017-09-06
    java
  • JavaScript中变量提升与预编译的示例分析
    这篇文章主要为大家展示了JavaScript中变量提升与预编译的示例分析,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“JavaScript中变量提升与预编译的示例分析”这篇文章吧。Java的特点有...
    99+
    2023-06-06
  • ubuntu如何用make进行编译
    ubuntu用make进行编译的示例:比如用make编译安装sqlite。下载sqlite源代码,地址:https://www.sqlite.org/download.html。进入源代码根目录,打开终端执行。./configure –pr...
    99+
    2022-10-11
  • 如何进行gcc动态编译
    如何进行gcc动态编译,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。优点:体积小,编译快 缺点:依赖性高 代码如下:[root@74-82-173-217 shared]#...
    99+
    2023-06-13
  • CentOS系统如何进行aMule编译
    这期内容当中小编将会给大家带来有关CentOS系统如何进行aMule编译,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。先给大家介绍下aMule,它是:"all-platform eMule&qu...
    99+
    2023-06-16
  • 如何进行Mysql5.6或Centos6.5源码编译安装
    这篇文章给大家介绍如何进行Mysql5.6或Centos6.5源码编译安装,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。## 说明 不同服务器需要改变 server_id ,同一台机器上需要改变 port 关闭防火墙[...
    99+
    2023-06-06
  • PHP中如何进行代码反编译和逆向工程?
    随着互联网技术的快速发展,网站和应用程序的开发越来越成熟,越来越复杂。其中,PHP语言是最受欢迎的开发语言之一,在各种Web应用程序和网站中都得到了广泛应用。然而,PHP语言的开源性导致了代码容易被恶意用户或黑客攻击,因此保护PHP代码的安...
    99+
    2023-05-14
    PHP代码反编译 PHP逆向工程 反编译工具
  • 详解如何进行Java环境配置与编译运行
    小编这次要给大家分享的是详解如何进行Java环境配置与编译运行,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。一、开篇通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印象的了解了...
    99+
    2023-05-31
    java ava
  • 如何进行JVM虚拟机中Java的编译期优化与运行期优化
    这篇文章将为大家详细讲解有关如何进行JVM虚拟机中Java的编译期优化与运行期优化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java编译期优化java语言的编译期其实是一段不确定的操作过...
    99+
    2023-06-02
  • CentOS PHP如何进行编译安装4.4.7版和5.2.5版
    CentOS PHP如何进行编译安装4.4.7版和5.2.5版,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。CentOS是一个开源软件贡献者和用户的社区。它对RHEL源代码...
    99+
    2023-06-16
  • 如何在CentOS中自行编译升级Git
    本篇文章给大家分享的是有关如何在CentOS中自行编译升级Git,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。git --version我安装的是CentOS-7-x...
    99+
    2023-06-05
  • 微信翻译如何使用?在微信中如何进行中翻译英
    利用微信翻译功能完成中翻译英?相信许多小伙伴在微信使用的过程中都有这样的需求,毕竟谁都有几个外国朋友。下面小编就来分享一下自己的经验,希望可以对小伙伴们有所帮助。...
    99+
    2023-06-02
  • Vue中如何进行网页预渲染
    这篇文章主要介绍了Vue中如何进行网页预渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。预渲染通常情况下,Vue项目是单页项目,也就是渲染出来的项目,只有一个index.h...
    99+
    2023-06-29
  • Python中如何进行数据预处理?
    Python是一种广泛使用的编程语言,它在数据科学和机器学习领域中也非常受欢迎。在这些领域中,数据预处理是一个至关重要的步骤,因为原始数据通常是不完整、不一致和不可靠的。在本文中,我们将讨论Python中如何进行数据预处理。 1.导入数据 ...
    99+
    2023-08-11
    日志 numy load
  • 如何在CMD中运行 Idea编译后的class文件
    本文章向大家介绍如何在CMD中运行 Idea编译后的class文件,主要包括{**}的使用实例,应用技巧,基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Idea编译后java文件和class文件不在同一个目录(后...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作