资讯专栏INFORMATION COLUMN

JavaScript-预编译

Aldous / 1719人阅读

摘要:预编译发生在函数执行前也就是说函数执行时,预编译已经结束。五总结理解预编译需要明白变量函数声明和变量赋值。预编译阶段,只进行变量函数声明,不会进行变量的初始化即变量赋值,所有变量的值都是变量赋值是在解释执行阶段才进行的。

一、JS的概念
JavaScript ( JS ) 是一种具有函数优先的轻量级解释型或即时编译型的编程语言。
二、JS语言特点 2.1 单线程

(1)JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率

(2)JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

2.2 解释型语言

(1)解释一行,执行一行;不通篇编译为一个文件再执行。

三、 JS执行过程 3.1 语法分析
通篇扫描低级语法错误,但不执行。
3.2 预编译 3.3 解释执行 四、JS的预编译

(1)预编译,简单理解,就是在内存中开辟一块空间,用来存放变量和函数。

(2)预编译发生在函数执行前;也就是说函数执行时,预编译已经结束。

4.1 变量 声明提升
变量声明语句放到最前,赋值不变。

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是有定义的,也就是说变量在声明之前已经可用, 所有这种特性称为声明提前(hoisting),即JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。

(1)JavaScript 脚本在执行之前先进行预编译,所以 ① 和 ③ 不会执行,而是先执行 ②,进行预编译;

(2)因为预编译阶段是不对变量进行赋值的,即不进行初始化,所以 ② 也只执行前半部分 var a ,由于只声明了变量,而没有进行赋值,所以此时变量的值为 undefined

(3)预编译完毕之后,JavaScript 脚本开始执行,执行顺序按照从上到下的顺序执行。

4.2 函数声明整体提升
函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部

(1)其实函数声明 function test() {} 已经提升到 test() 之前,这也是预编译导致的,所以函数 test() 能够在定义之前执行,并且没有报错。

五、总结

(1)理解预编译需要明白 ①变量/函数声明 和 ②变量赋值

(2)预编译阶段,只进行 变量/函数声明,不会进行变量的初始化(即变量赋值,所有变量的值都是 undefined);变量赋值 是在解释执行阶段才进行的

阅读更多

参考文章 JavaScript的预编译

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94782.html

相关文章

  • JavaScript编译过程分析

    摘要:一概念是一个单线程解释型的编程语言。预编译大致可分为步创建对象找形参和变量声明,将形参和变量名作为属性名,值为将实参值和形参统一在函数体里面找函数声明,值赋予函数体。 一、JavaScript概念 JavaScript ( JS ) 是一个单线程、解释型的编程语言。 二、JavaScript语言特点 2.1 单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能...

    graf 评论0 收藏0
  • 5分钟读懂JavaScript编译流程

    摘要:大家都知道是解释型语言,既然是解释型语言,就是编译一行,执行一行,那又何来预编译一说呢脚本执行引擎都做了什么呢今天我们就来看看吧。全局域就是一切声明的全局变量,全是的属性等同于函数预编译发生在函数执行前一刻。 大家都知道JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行,那又何来预编译一说呢?脚本执行js引擎都做了什么呢?今天我们就来看看吧。 1-JavaScr...

    Baoyuan 评论0 收藏0
  • javascript系列--javascript引擎执行的过程的理解--语法分析和编译阶段

    摘要:所以觉得把这个执行的详细过程整理一下,帮助更好的理解。类似的语法报错的如下图所示三预编译阶段代码块通过语法分析阶段之后,语法都正确的下回进入预编译阶段。另开出新文章详细分析,主要介绍执行阶段中的同步任务执行和异步任务执行机制事件循环。 一、概述 js是一种非常灵活的语言,理解js引擎的执行过程对于我们学习js是非常有必要的。看了很多这方便文章,大多数是讲的是事件循环(event loo...

    malakashi 评论0 收藏0
  • 浅谈JavaScript作用域

    摘要:我们在面试时,总会碰到一些奇奇怪怪的关于作用域的面试题,其实弄清楚原理,万变不离其宗,大部分的面试题都可以得姐。 showImg(https://segmentfault.com/img/bV7Cri?w=1563&h=879); 我们在面试时,总会碰到一些奇奇怪怪的关于 作用域 的面试题,其实弄清楚原理,万变不离其宗,大部分的面试题都可以得 ‘姐’。 所以,今天我们来谈谈 JavaS...

    figofuture 评论0 收藏0
  • JavaScript编译过程与作用域

    摘要:词法作用域是一种静态作用域这个例子的结果按静态作用域来分析执行函数,先从函数内部查找是否有局部变量,如果没有,就根据书写的位置,查找上面一层的代码,也就是等于,所以结果会打印。静态作用域,决定的是作用域链的顺序。 博客原文地址:https://finget.github.io/2018/03/01/javascriptPrecompile/看不明白的地方欢迎提问,有理解的不对的地方希望...

    ziwenxie 评论0 收藏0

发表评论

0条评论

Aldous

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<