javascript-代码执行原理

news/2024/9/19 4:48:11 标签: javascript, 前端

js 是解释型语言

js 引擎执行流程

分为两个阶段:

  1. 语法分析
  2. 执行阶段

执行阶段涉及的数据结构:

  • 调用栈。处理执行上下文和执行代码
  • 内存堆。给对象分配内存
  • 任务队列。暂存待执行的任务,分为宏任务队列和微任务队列

语法分析

词法分析 > 语法分析 > 代码生成(字节码)

执行阶段

代码生成后 js 引擎会先创建执行上下文(也叫预编译),再逐块(执行上下文)逐行执行代码

执行上下文

分类:

  • 全局执行上下文
  • 函数执行上下文
  • eval 函数执行上下文(下文暂不提及)

第一次读取 js 脚本时会生成全局执行上下文,有且只有一个,始终位于调用栈底部。当函数被调用时,会创建一个函数执行上下文并推入当前栈顶,执行完函数会出栈。栈顶是当前活动的执行上下文

image.png

每次创建执行上下文主要有以下几个步骤:

  1. 初始化作用域链
  2. 创建变量对象
  3. 创建 arguments 对象,检查参数上下文,初始化名称和值,并创建引用副本
  4. 扫描上下文中函数的声明
    • 对于找到的每个函数,在变量对象中创建一个属性,该属性是确切的函数名,该函数在内存中有一个指向该函数的引用指针
    • 如果函数名已经存在,指针将会被覆盖
  5. 扫描变量的声明
    • 对于找到的每个变量,在变量对象中创建一个属性,该属性是确切的变量名,该变量的值是 undefined
    • 如果变量名已经存在,将不会做任何处理继续执行
  6. 确定 this 的指向

JavaScript 执行上下文——JS 的幕后工作原理

变量、函数提升

函数和变量声明提升是在创建变量中进行的,举个例子:

function foo(a) {
   
  console.log(b);
  console.log(foo2);
  console.

http://www.niftyadmin.cn/n/5664991.html

相关文章

OpenCV_最简单的鼠标截取ROI区域

在OpenCV中也存在鼠标的操作,今天我们先介绍一下鼠标中的操作事件 void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata0) setMousecallback参数说明: winname:窗口的名字 onMouse:鼠标响应函数,回调…

什么是OOM

OOM是“Out Of Memory”的缩写,意为“内存不足”。当计算机或应用程序在运行过程中无法分配足够的内存空间来 存储数据时,就会出现OOM错误,这通常会导致应用程序崩溃,影响用户体验。一、OOM发生的原因 OOM发生的原因多种多样&…

python毕业设计基于django+vue医院社区医疗挂号预约综合管理系统7918h-pycharm-flask

目录 技术栈和环境说明预期达到的目标具体实现截图系统设计Python技术介绍django框架介绍flask框架介绍解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性技术路线感恩大学老师和同学详细视频演示源码获取 技术…

最优化理论与自动驾驶(十一):基于iLQR的自动驾驶轨迹跟踪算法(c++和python版本)

最优化理论与自动驾驶(四):iLQR原理、公式及代码演示 之前的章节我们介绍过,iLQR(迭代线性二次调节器)是一种用于求解非线性系统最优控制最优控制最优控制和规划问题的算法。本章节介绍采用iLQR算法对设定…

Sqlmap中文使用手册 - File system access模块参数使用

目录 1. File system access模块的帮助文档2. 各个参数的介绍2.1 --file-readFILE2.2 --file-writeFILE2.3 --file-destFILE 1. File system access模块的帮助文档 File system access:These options can be used to access the back-end database managementsystem underlying…

【无标题】Java_Se 数据变量与运算符

标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。这些是编程中的“砖块”,是编程的基础。要想开始正式编程,还需要再学“控制语句”,控制语句就像“水泥”,可以把“砖块”粘到一起,最终形成“一座大…

LED灯、蜂鸣器、继电器的控制

LED灯的控制 该专栏所有文章都默认使用STM32F103ZET6开发板 目录 LED灯的控制 一、简单的LED灯控制 1、初始化函数 led灯 2、应用函数 2、蜂鸣器 3、继电器 一、简单的LED灯控制 编程框架:初始化函数和应用函数 1、初始化函数 初始化函数一般包括&#xf…

如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用

要将一个一维数组切分成相同等分,你可以使用 Python 的内置功能或者 NumPy 库(如果你处理的是数值数据)。以下是几种不同的方法: 方法3 pad_sequence 结合dataloader 应该是最佳方案 ### 方法 1: 使用 Python 的内置切片功能 如果…