懒编译您 javascript
marja 的 parsing javascript better lazy than eager
解析什么是解析
- 解析 javascript code 为 AST 和 Scope 作用域
今天我们之关心这部分内容 - 生成字节码, 这个字节码用于解释器
- 优化编译为机器码在 电脑上执行
我们通常认为 javascript 是一门解释性还是编译的语言呢
sum(1,2)
function sum(a,b){
return a + b;
}
function foo(){
let a = 0;
if(a == 0){
let b = "bar";
return a;
}
}
从上面代码运行没有问题来看 javascript 应该属于编译语言。
准备用 mac 的 keynote 画树形结构图,感觉连线有点费劲放弃了。
- 第一层是 foo 函数对应节点 FunctionIterial
let a = 0;
- 当我们 声明创建一个变量同时就生成一个变量的代理。 然后就是我们的赋值语句。分别是变量代理和
if(a == 0){
let b = "bar";
return a;
}
- 看一下我们的 条件语句
因为没有 else 只有 if 所以就走 then。
作用域分析
# 为什么我们需要关注解析
因为我们parsing
不同的浏览器对lazy定义也不同,由于 javascript 本身并没有 spec 来定义lazy。
#### V8 有两种有两种解析模式
- eager parser 进行完全的解析, 构建 AST、 构建作用域, 检查语法错误。
- lazy preParser 构建 scope(作用域)而不构建 AST,
lazy 和 eager
let a = 0;
//IIFE (immediately invoked function express)
(function() eager() { // stuff })();
function lazy(){ //stuff }
lazy();
- 通过()()包裹函数是立即执行函数
- 即使 lazy 在最顶层被定义,lazy 也是 懒函数,只有在调用才会执行。
!function eager2(){ // stuff },function eager3(){ // stuff }
在函数前面添加 ! 表示这个函数是立即执行函数, 后面通过逗号间隔的也同样是立即执行函数。
也有一些特殊的情况
let f1 = function lazy() { // stuff }
let f2 = function lazy(){ // stuff }()
f1 变量接受 lazy 函数作为值,作为懒函数来处理
f2 接受这个函数执行的结果作为 f2,首先我们看 lazy 应该是懒函数,但是他被立即执行了。
那么 懒函数跟我们有关系吗?
因为不是所有加载 javascript 都会被执行的,所以我们需要赖 加载来提高效率。
- 如果一个 eager 立即编译函数 没有被 调用, 这就是一种浪费。
- 如果 一个懒函数被 执行了,当然也是一种资源的浪费,因为我们将这个函数编译了两次,第一次 编译可能需要 0.5 ,第二次又进行 了编译,所以一共 1.5 时间。
强制 函数为立即编译模式
(function a(){})
Optimize.js 将那些将会在引用中(上面的情况) 进行包裹让他变成立即编译函数
ctxt 分配,赖函数我们需要分配 ctxt
let f = (function outer(){
let a = 20;
function inner(){ return 1 }
return inner;
})();
console.log(f());
我们看一看上面的代码的 f 接收一个立即 编译函数的返回值,返回值是一个懒函数,
网友评论