美文网首页
[JavaScript基础] 递归,预编译

[JavaScript基础] 递归,预编译

作者: Darkdreams | 来源:发表于2018-11-13 18:11 被阅读0次

    递归

    1. 找规律
    2. 找出口,如果没有出口,就是死循环。
      函数自调用
    // 阶乘
    // n! = n * (n - 1)!
    function num(n) {
      if(n == 1 || n == 0) {
        return 1
      }
      return n * num(n - 1)
    }
    num(10)  // 3628800
    
    //斐波那契额数列
    // fb(n) == fb(n - 1) + fb(n - 2)
    function fb(n) {
      if(n == 1 || n == 2) {
        return 1
      }
      return fb(n - 1) + fb(n - 2)
    }
    fb(10) // 55
    

    预编译

    JavaScript,是单线程,解释性语言。

    语法分析

    浏览器会通篇扫描,检查代码有没有低级错误,比如使用了中文符号等。但不执行代码

    1. 函数声明整体提升,不管函数声明写到哪里,浏览器都会提升到最前面。
    test();  //-可执行
    function test() {
      console.log("被提升了")
    }
    
    1. 变量 声明提升
    //var a;
    console.log(a); // undefined
    // a = 123
    var a = 123;
    console.log(a); // 123
    

    预编译前奏
    1. imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象window所有。
    var a = 1;
    b = 2; //- window.b = 2
    //
    function demo() {
      var a = b = 123;   
      /*
        先赋值123给b,再声明a,把b的赋值给a。
        a是局部变量,而b未经声明是个全局变量。
      */
    }
    demo();
    console.log(a);
    console.log(b);
    
    1. 全局上所有声明的变量(函数),全是window的属性。
    var a = 1;
    /* window {    //a就是window的属性
        a : 1
      }
    */
    

    函数预编译过程(四步骤)
    1. 创建OA对象Activation Object(执行期上下文);
    2. 找形参和变量声明,将形参和变量名作为AO的属性名;
    3. 实参和形参值相统一;
    4. 在函数体中找到函数声明(函数声明优先级最高)

    全局预编译过程
    1. 创建GO对象Global Objectwindow === GO
    2. 找形参和变量声明,将形参和变量名作为GO的属性名;
    3. 在函数体中找到函数声明(函数声明优先级最高)

    解释执行

    相关文章

      网友评论

          本文标题:[JavaScript基础] 递归,预编译

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