专栏首页前端の进行时JavaScript-预编译

JavaScript-预编译

一、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的预编译

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript-作用域、块级作用域、上下文、执行上下文、作用域链

    (2)实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性。

    WEBING
  • JavaScript-变量/函数声明提升

    (1)如上定义了一个名为test的变量,但未给这个变量进行初始化(也就是没有赋值),此时其默认初始化值为 undefined。

    WEBING
  • JavaScript-立即调用函数表达式(IIFE)

    (2)【注意】JavaScript引擎规定,如果function关键字出现在行首,一律解释成函数声明语句

    WEBING
  • GTest(基于YApi)接口研发效能提升10倍 实战

    现在的互联网行业已经不是大鱼吃小鱼的时代了,而是快鱼吃慢鱼的时代,具体来讲就是从用户需求转化成企业服务的能力,其中研发效能的高低对用户需求转化速率起到了至关重要...

    咻咻ing
  • 【RSA2019创新沙盒】ShiftLeft:面向软件开发生命周期的持续性安全防护

    ShiftLeft公司,成立于2016年,总部位于美国加利福尼亚州圣克拉拉市。该公司致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发...

    绿盟科技研究通讯
  • 常见的Mybatis面试题详细讲解大全

    2、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

    Java学习
  • 第二篇 爬虫技术之HTML

    hello,大家好今天我们继续分享爬虫的相关技术,今天我们分享的是html的基础知识。

    还是牛6504957
  • 【39期】Mybatis面试18问,你想知道的都在这里了!

    答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql....

    良月柒
  • 2020年,MyBatis常见面试题总结

    Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,...

    Java码农那些事
  • 机器学习让脑机接口「即插即用」!Nature 子刊:瘫痪患者也能控制光标

    前段时间,科技狂人 Elon Musk 现场展示了 Neuralink 最新进展,和他的三只小猪一起冲上热搜。有人说这才是前沿科技,大呼一个全新时代要开始了;也...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券