js在编译时干了啥?

本文详细介绍了JavaScript的编译阶段,包括词法分析、语法分析和代码生成。重点讨论了词法作用域、动态作用域、全局作用域、函数作用域和块作用域的概念,以及变量查找规则。JavaScript的执行环境分为全局执行环境、函数执行环境和代码块执行环境,执行环境和作用域链是确保变量和函数有序访问的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程语言分为:编译型语言和解释型语言。

编译型和解释型语言的区别:编译型语言在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了。而由解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行动态解释和执行

编译型语言:例如java,c
解释型语言:例如JavaScript, python

如图所示:
在这里插入图片描述

如图所示,JavaScript代码并不需要编译成二进制文件,所以JavaScript是一种解释型编程语言,它由事件与对象驱动,支持面向过程,面向对象,命令式以及函数式编程。(可以自己去了解)

运行js代码有两个阶段: 编译阶段、执行阶段
本文主讲第一个阶段,执行阶段在下篇

编译阶段

  1. 词法分析
    生成词法单元,例如,var a = 2;这段代码会被分解成这些词法单元:var,a,=,2,;。
  2. 语法分析
    将词法单元流(数组)转换成一个由元素逐级嵌套所组成的抽象语法树(AST),并生成词法作用域
  3. 代码生成
    将AST语法树转换为可执行代码的过程被称为代码生成,在这期间进行内存分配以及生成全局执行环境(上下文)

内存模型:在js引擎完成语法分析进行代码生成时会为变量分配空间(内存)。分为4个区

  • 栈区:存放的是真正的值,比如函数的参数值,局部变量。
  • 堆区:存放的是对象的引用(逻辑地址),比如function,array
  • 静态区:存放的是全局变量和静态变量
  • 常量区:存放的是常量

作用域和执行环境

作用域:对变量和函数的访问
  1. 词法作用域 动态作用域,在js中采用的是词法作用域。
  2. 一套用于查找变量的规则
  3. 词法作用域是静态的,它由你写代码时将变量和块作用域写在哪里来决定的
  4. 词法作用域分为全局作用域,函数作用域以及块作用域

变量查找规则:左查询(LHS)和右查询(RHS),左查询是对变量进行查找,找不到便创建一个变量默认值为undefined。右查询是查找变量的值,如果在全局作用域中未能获取变量的值便会报错为ReferenceError。
举例0:

var a;
console
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值