Javascript AST 编译器的研究学习

简介: # Javascript AST 编译器的研究学习 ## Source: ```javascript 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _IceInteractContainer = require('./InteractContaine

Javascript AST 编译器的研究学习

Source:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _IceInteractContainer = require('./InteractContainer');

var _IceInteractContainer2 = _interopRequireDefault(_IceInteractContainer);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

if (location.host === "xxxx.taobao.com") {
    lib.x = 10
}

exports.default = _IceInteractContainer2.default;
module.exports = exports['default'];

AST:

https://astexplorer.net/

image

初步观察

可以得到一些明确的信息:

  • 整个文件代表着一个Program
  • JavaScript的代码过程被解释成一个数组,并在body属性里

还有很多未知的信息,我就暂时先忽略了。

Body

可以看到,里面有ExpressionStatement、VariableDeclaration、FunctionDeclaration、IfStatement这些实例。
我们对应到源代码中就不难理解了:

'use strict';  // AST:ExpressionStatement

Object.defineProperty(exports, "__esModule", { // AST:ExpressionStatement
    value: true
});

var _IceInteractContainer = require('./InteractContainer'); // AST:VariableDeclaration

var _IceInteractContainer2 = _interopRequireDefault(_IceInteractContainer); // AST:VariableDeclaration

// AST:FunctionDeclaration
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

if (location.host === "xxxx.taobao.com") { // AST:IfStatement
    lib.x = 10
}

exports.default = _IceInteractContainer2.default; // AST:ExpressionStatement
module.exports = exports['default']; // AST:ExpressionStatement

看来是将JS进行了归纳,表达式语句、变量描述、函数描述、IF语句等等。
因此不难想象,应该还有While语句等等吧。

ExpressionStatement

Literal

    
    'use strict';  // AST:ExpressionStatement

image

展开ExpressionStatement,可以看到有个 expression 属性,这条表达式主要的信息也就在这了。
值得注意的是 expression 指向的是一个 Literal 实例.

  • type:文本
  • value:值"use strict"

rawValue 和 raw 又有啥区别?(未知)

看起来很简单,一个字符串文本执行语句。
那再继续看看一个函数调用的语句将会变成什么样。

CallExpression

Object.defineProperty(exports, "__esModule", { // AST:ExpressionStatement
    value: true
});

image

可以看到 CallExpression 实例有个 calleearguments,代表着谁在调用和参数是谁。

callee : MemberExpression

image

这时候我们看到一个新的实例 MemberExpression
这是一个成员表达式,其实我们经历过这些探究之后,不难想象有什么能够编译成 MemberExpression,比如:
alert(hello.word)里面的hello.word就会编译成MemberExpression

MemberExpression

从上图可以看到,MemberExpression实例有两个关键的属性,Objectproperty,粗暴的理解就是,'.'(点)前面的就是Object,后面的就是property

但是,hello[0] 的情况呢?
这个就有点意思了,hello[0] 也会被编译成 MemberExpression的实例。
这个可以自己尝试和对比下看看。

然后可以看到Object.defineProperty被拆分成了两个Identifier实例,分别放在了Objectproperty属性里面.

Identifier

这个标识符类,关键的就是 name属性了。
总结下其实可以得出什么东西会别编译成Identifier, 例如:

var a = new Function;
a; // AST:Identifier

arguments

值得一说的是,我这里说的是参数是谁,也就意味着,他可以是任何其他的实例,可能是一个 Literal,可能还是一个CallExpression,又或者是MemberExpression, 但它应该不会是 VariableDeclaration ,IfStatement,嗯,从语法层面来看,是不可能的。
image

嗯。现在看来这个 ObjectExpression是没有出现和分析过的,不过按照笔者的思路,也可以尝试去看看这个实例了。~

相关文章
|
2月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
72 3
|
3月前
|
JavaScript
ES6学习(9)js中的new实现
ES6学习(9)js中的new实现
|
9天前
|
存储 JavaScript 前端开发
JavaScript学习第一章
本文档介绍了JavaScript的基础知识,包括其在网页中的作用、如何通过JavaScript动态设置HTML元素的CSS属性,以及JavaScript中的变量类型(`var`、`let`、`const`)和数据类型(基本数据类型与引用数据类型)。通过实例代码详细解释了JavaScript的核心概念,适合初学者入门学习。
|
2月前
|
JavaScript
js学习--制作猜数字
js学习--制作猜数字
38 4
js学习--制作猜数字
|
2月前
|
JavaScript
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
这篇文章介绍了如何将webpack的配置文件分离成开发环境和生产环境的配置文件,以提高打包效率。
48 1
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
3月前
|
JavaScript 前端开发 API
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
该文章跟随月影老师的指导,探讨了编写优质JavaScript代码的三大原则:各司其职、组件封装与过程抽象,通过具体示例讲解了如何在实际开发中应用这些原则以提高代码质量和可维护性。
紧跟月影大佬的步伐,一起来学习如何写好JS(上)
|
2月前
|
JavaScript
js学习--制作选项卡
js学习--制作选项卡
37 4
|
2月前
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
20 2
|
2月前
|
JavaScript
js学习--九宫格抽奖
js学习--九宫格抽奖
19 2