前言:在JavaScript中存在一种预编译的机制,这也是Java等一些语言中没有的特性,也就正是因为这个预编译的机制,导致了js中变量提升的一些问题,下面这两句话能解决开发当中一部份问题,但不能解决所有问题,还有一些问题是你必须通过学习预编译才能解决的。

  1. 函数声明整体提升(函数定义会提升,传参也会提升。)
  2. 变量声明提升(*注意预编译时,变量声明提升,但变量赋值不会提升

预编译分为全局预编译和局部预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。

预编译阶段发生变量声明和函数声明,没有初始化行为(赋值),匿名函数不参与预编译 。只有在解释执行阶段才会进行变量初始化 。

tip:JS函数的调用永远都是在函数声明下面调用,即使你的调用是写在函数声明之前的,它隐式也是在函数声明下调用的。

局部预编译的4个步骤:

创建AO对象(Activation Object)执行期上下文。
找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
将实参值和形参统一。
在函数体里面找函数声明,值赋予函数体。

全局预编译的3个步骤:

创建GO对象(Global Object)全局对象。
找变量声明,将变量名作为GO属性名,值为undefined
查找函数声明,作为GO属性,值赋予函数体

原文章:

https://zhuanlan.zhihu.com/p/50236805

JavaScript预编译相关推荐

  1. JavaScript预编译过程

    JavaScript预编译过程 阶段(三个) 预编译过程 1. JavaScript代码执行之前的预编译 案例说明 2. 函数执行前的预编译 案例说明 总结 预编译两个小规则: 预编译前奏 阶段(三个 ...

  2. 5单个编译总会编译全部_5分钟读懂JavaScript预编译

    大家都知道JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行,那又何来预编译一说呢?脚本执行js引擎都做了什么呢?今天我们就来看看吧. 1-JavaScript运行三部曲 语法 ...

  3. JavaScript作用域原理——预编译

    JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数 ...

  4. Javascript作用域原理---预编译

    问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); ...

  5. JavaScript的预编译及执行顺序

    从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序. 如果说,JavaScript引擎的工作机制比较深奥是 ...

  6. javascript运行过程中的“预编译阶段”和“执行阶段”

    javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的"预编译阶段"(javascrip ...

  7. javascript代码块概念及预编译机制

    JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解javaScript语言的运行机制,或者简单地 ...

  8. javascript之预编译

    首先要记住:预编译发生在函数执行的前一刻 先来一个小知识: 函数声明整体提升 test(); function test(){...//省略n行代码 } 在预编译阶段,会把函数声明提升到代码顶部: f ...

  9. JavaScript中函数作用域之精辟,函数原理的浅入深出,及程序执行预编译之通天编译???

    1.程序执行的前一刻会先将代码预编译一遍,如果有语法错误则直接终止程序运行 //预编译之通天编译 --> 在执行的前一刻,会把文件通天扫描一遍 /** //预编译 函数整体提升(即函数会放到程序 ...

最新文章

  1. Deep Learning回顾之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  2. Jupyter不要自动启动浏览器(Firefox)
  3. windows环境下安装scrapy框架报错问题--最快捷有效的解决方案
  4. cad2014卡顿的解决方法_升级iOS14.1后出现卡顿、闪退?这3种方法可以解决
  5. [BZOJ4027][HEOI2015]兔子与樱花(贪心)
  6. Python - 调试Python代码的方法
  7. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口
  8. 首批国家应用数学中心名单公布,哪些高校获批?
  9. 动软代码生成器连接Oracle 11g
  10. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别(小问题大思想)
  11. 大数据分析可以用哪些营销策略
  12. 招聘 | 刘知远老师博士生涂存超博士创办的「幂律智能」招NLP算法工程师啦
  13. android stadio 编译报错:download fastutil-7.2.0.jar
  14. Unity: 打飞碟Adapter版
  15. 单片机通过串口与电脑通信
  16. vs2010无法找到程序,安装Microsoft Visual Studio 2010 Service Pack 1 ,系统无法找到指定的对象
  17. 【圣诞节限定】教你用Python画圣诞树,做个浪漫的程序员
  18. python循环案例:模拟银行ATM存款取款
  19. 用requests的get检验电视直播源是否有效的方法
  20. Python之Datasets库安装报错的解决方法

热门文章

  1. 使用Python和plotly制作列线图
  2. MapInfo数据格式
  3. 分布式锁redisson的使用 看门狗原理
  4. 业务知识 - 人群圈层汇总
  5. linux中的绝对路径 lt gt,Linux中目录以及路径问题
  6. mathimatica 和matlab,Mathematica和Matlab功能对比
  7. Android之GridView+BaseAdapter
  8. 致力协同办公oa系统服务器设置,致力协同办公OA系统——安装手册.pdf
  9. oa系统对服务器的要求1000台,OA办公系统协同办公平台运行服务器最低配置要求...
  10. 苹果vs剪辑下载_Mac上有哪些好用的视频剪辑软件