美文网首页程序员
有关您的 javascript 函数编译(上)

有关您的 javascript 函数编译(上)

作者: zidea | 来源:发表于2019-02-22 20:26 被阅读21次

懒编译您 javascript

marja 的 parsing javascript better lazy than eager

解析什么是解析

  1. 解析 javascript code 为 AST 和 Scope 作用域
    今天我们之关心这部分内容
  2. 生成字节码, 这个字节码用于解释器
  3. 优化编译为机器码在 电脑上执行

我们通常认为 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 画树形结构图,感觉连线有点费劲放弃了。

  1. 第一层是 foo 函数对应节点 FunctionIterial
let a = 0;
  1. 当我们 声明创建一个变量同时就生成一个变量的代理。 然后就是我们的赋值语句。分别是变量代理和
if(a == 0){
    let b = "bar";
    return a;
}
  1. 看一下我们的 条件语句
    因为没有 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();
  1. 通过()()包裹函数是立即执行函数
  2. 即使 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 接收一个立即 编译函数的返回值,返回值是一个懒函数,

相关文章

网友评论

    本文标题:有关您的 javascript 函数编译(上)

    本文链接:https://www.haomeiwen.com/subject/oldyyqtx.html