JS预编译精讲

什么是预编译?

JS程序在执行前会进行一次简单的预编译,常用来判断是否含有低级的语法错误来减轻JS引擎的执行压力

预编译的执行流程是什么?

(预编译需要用到作用域的知识,如果有不懂作用域是什么的,可以看看我主页的作用域文章;记得点个关注哟~)

全局环境预编译四部曲:

  1. 扫描一遍整个JS代码看看是否拥有低级的语法错误
  2. 创建全局作用域
  3. 找到所有的变量声明:var i,然后将他们的变量名放置到全局作用域中,并将其赋初始值“undefined”i : undefined
    注:如果我们的变量声明时并且给他赋值了var i = 0,我们的值并不会直接加入到全局作用域中而是当代码执行到这一行时才会将值添加到全局作用域中,相当于:var i; i = 0;
  4. 找到所有的函数声明:function fn(){},然后将它的函数名和函数体一起添加到全局作用域中fn : function (){}
    注:函数声明是直接在预编译时就将函数体添加到作用域中的
    在这里插入图片描述
    拓展知识点:函数分为两种赋值方式:function fn(){}称为函数声明(在预编译时会直接将函数体添加到全局作用域中),var fn = function (){}称为函数字面量(在预编译时并不会直接将函数体添加到全局作用域中而是相当于var fn; fn = function (){},这样子就相当于变量声明一致了,当JS代码执行到此处时才将函数体添加到全局作用域中)

函数内部预编译四部曲:

  1. 创建函数作用域
  2. 找到所有**形参(function fn(a,b){}中的a,b就是形参,全称形式参数)**和变量声明var i,形参执行的操作和变量声明一致(执行操作与全局作用域的变量声明操作一致,这里便不再赘述)
  3. 将所有的形参和**实参(fn(1, 2)这里的1,2就是实参,全称实际参数)**相统一,相统一表示拿实参给形参赋值相当于a = 1; b = 2;(注意:在这一步预编译之前它的形参的值和变量声明一致为undefined)
  4. 找到所有函数声明,这里和全局预编译的函数声明操作一致便不再赘述
    在这里插入图片描述

拓展知识点

  1. 函数声明分为两种:function fn(){}称为函数声明,var fn = function (){}称为函数字面量,函数字面量在预编译时执行的操作和变量声明一致(相当于var fn; fn = function (){}当js执行到fn = function (){}时才将函数体赋给fn变量)
  2. 如果在函数内部有一个变量并没有声明var就直接对其进行赋值JS引擎则会在全局作用域中添加一个这个变量,然后将值赋给这个变量
  3. if条件内部写函数时无效的

谢谢大家能够阅读到这里,如有发现文章中有错误知识或描述不清的地方欢迎大家到评论区指出本人会加以改进,希望能帮助到你们,最后别忘了点个小赞再走哦~

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页