JS预编译 的一些小知识了

336 阅读3分钟

写多了vue和react,你是否还记得那个最初的原生JS呢? 惭愧我的 今天开始复习一下原生知识,也顺便也一些笔记,留给以后时常回忆,笔记内容是看着教学视频抄的,如有错误,欢迎指正

求阶乘

function nums(a){

            if(a === 1 || a === 0){
                return 1;
                
            }
            return a*nums(a-1)
        }
        
    console.log(nums(5))  // 120

斐波那契数列

    function nums(a){
                    if(a === 1){
                        return ;
                    }
                    return  nums(a-1)+nums(a-2)
                }
        
        console.log(nums(5))

预编译


一.JS执行过程

1.语法分析

2.预编译

3.解释执行


二.预编译过程

1.简单规则:

函数声明,整体提升

变量声明, 声明提升

2.编译过程

1.创建AO对象

2.找到形参和变量声明,将变量和形参名 最为AO属性名 值位undefined

3.将实参值和形参统一

4.在函数体里面找到函数声明,值赋予函数体


3.示例

 function a(a){
          console.log(a)  // function

          var a = 123

          console.log(a)  // 123

          function a(){}

          console.log(a)  // 123

          var b = function (){}
          console.log(b)  //function
           
       }
       a(1)

//执行步骤分析

//1.创建AO对象

AO {

}

//2.找到形参和变量声明,将变量和形参名 最为AO属性名 值位undefined
Ao {
    a: undefined,
    b: undefined
}

//3.将实参值和形参统一
Ao {
    a: 1 , // a 先被赋值为调用的 形参的值 1   
    b: undefined   // 这里的 函数 b 不会被提升,因为 函数b  是函数表达式,只提升变量
}

// 4.在函数体里面找到函数声明,值赋予函数体
Ao {
    a: 1 -> function a(){}, //  function a(){}  这里 注意: function a(){} 是函数声明
    b: undefined   // 这里的 函数 b 不会被提升,因为 函数b  是函数表达式,只提升变量
}

4.示例

function test (a, b){
          console.log(a) // 第一个 1

          c = 0
          var c;
          a = 3;
          b = 2;
          console.log(b) // 第二个 2

          function b(){}
          function d(){} 
          console.log(b) // 第三个 2
      }
      test(1)

5.示例

      function test (a, b){
         console.log(a)  // function a(){}
         console.log(b) // undefined
         var b = 234
         console.log(b)  // 234
         a = 123
         console.log(a)  // 123
         function a(){} 
         var a;
         b = 234;
         var b = function(){}
         console.log(a)  // 123
         console.log(b)  // function(){}
      }
      test(1)

6.示例

      global = 100;
      function fn(){
          console.log(global) // undefined
          global = 200
          console.log(global) // 200
          var global = 300
      }

      fn()

7.示例

        function test(){
            console.log(b) //undefined
            if(a){
                var b = 100
            }
            c = 123

            console.log(b) //undefined
        }
        var a;
         test();
         a = 10;
         console.log(c) //123

8.隐式转换

console.log(typeof(a)) // "undefined"
console.log(typeof(null)) //object
//  !!" " => true
//  !!""  => false
 if(typeof(a)&& -true + (+undefined)+""){
            /**
            *  typeof(a)  'undefined'
            *  -true   -1
            *  +undefined  NAN
            *  -true + (+undefined)+""  "NAN"
            **/
        // 因此 整个IF语句是true
          console.log(1)
      }

闭包

但凡是内部的函数被保存到了外部,就会形成闭包

        function a(){
            var aa = 0
            function b(){
                aa++
                console.log(aa)
            }
            return b;
        }
        // a()() 1
        // a()() 1
        let demo = a()
            demo() //1
            demo() //2 
    function test(){
        var num = 100
        function a(){
            num++
            console.log(num) //101
        }
        function b(){
            num--
            console.log(num) //100
        }
        return [a,b]
    }

    var mtArr = test()
    mtArr[0]()
    mtArr[1]()

立即执行函数

(function(){
    var a= 123
    var b= 456
    console.log(a+b)
}())

+function(){}()

var test = function(){}()

//这样不能执行,且报错
function(){

}()

//这样不能执行,但是不报错
function(a,b,c){

}(1,2,3)

function test (){
            var arr = []
            for(var i=0;i<10;i++){
                arr[i] = function(){
                    console.log(i)
                }
            }
            return arr;
        }

        var myArr = test()
            myArr[0]()  // 10
            myArr[1]()  // 10


// 改写
        function test (){
            var arr = []
            
            for(var i=0;i<10;i++){
                (function(i){
                    arr[i] = function(){
                        console.log(i)
                    }
                }(i)) 
            }
            return arr;
        }

        var myArr = test()
            myArr[0]()  // 0
            myArr[1]()  // 1