美文网首页程序员
有关您的 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