JS面试题--深入JavaScript运行原理

news2024/11/18 4:48:22

深入JavaScript运行原理

JavaScript让人迷惑的知识点

image-20230107091827868

JavaScript是一门编程语言

image-20230107091905541

浏览器的工作原理

一般的浏览器有以下主要部分组成:

1. 用户界面

包括浏览器中可见的地址输入框,浏览器前进返回按钮,打开书签,打开历史记录等用户可操作性的功能选项。

2. 浏览器引擎

用来查询及操作渲染引擎的接口,可以在用户界面和渲染引擎之间传送指令或在客户端本地缓存中读写数据等。

3. 渲染引擎

解析 DOM 文档和 CSS 规则并将内容排版到浏览器中显示有样式的界面,我们常说的浏览器内核主要指渲染引擎。

4. 网络功能模块

是浏览器开启网络线程发送请求或下载资源文件的模块,例如 DOM 树解析过程中请求静态资源首先是通过浏览器中的网络模块发起的。

5. UI 后端

UI 后端则用于绘制基本的浏览器窗口内控件,比如组合选择框,按钮,输入框等,具有不特定与某个平台的通用接口,底层使用操作系统的用户接口。

6. JS 解释器

用来解释和执行 JavaScript 代码,例如 V8 引擎。

7. 数据持久化存储

处于持久层,浏览器需要在硬盘中保存类似 cookie 的各种数据,HTML5 定义了 web database 技术,这是一个轻量级的完整的客户端存储技术,浏览器数据持久化存储则涉及到 cookie,localStorage等一些客户端存储技术,可以通过浏览器引擎提供的 API 进行调用。

image-20230107091926554

认识浏览器的内核

image-20230107092004969

浏览器渲染过程

image-20230107092642338

抽象语法树—词法分析树网站 https://astexplorer.net/

抽象语法树的应用场景很多的

image-20230107090036275

image-20230107085901610

认识JavaScript引擎

image-20230107093055999

浏览器内核和JS引擎的关系

image-20230107093120363

V8引擎的原理

image-20230107093602491

V8引擎的架构

image-20230107093739056

V8引擎的解析图(官方)

image-20230107095056766

V8执行的细节

image-20230107095127298

JavaScript的执行过程

image-20230107101508523

初始化全局对象

image-20230107101542982

image-20230107095924782

var name = "why"

console.log(num1)

var num1 = 20
var num2 = 30
var result = num1 + num2

console.log(result)

/**
 * 1.代码被解析, v8引擎内部会帮助我们创建一个对象(GlobalObject -> go)
 * 2.运行代码
 *    2.1. v8为了执行代码, v8引擎内部会有一个执行上下文栈(Execution Context Stack, ECStack)(函数调用栈)
 *    2.2. 因为我们执行的是全局代码, 为了全局代码能够正常的执行, 需要创建 全局执行上下文(Global Execution Context)(全局代码需要被执行时才会创建)
 */
var globalObject = {
  String: "类",
  Date: "类",
  setTimeount: "函数",
  window: globalObject,
  //解析的时候没有执行,所以是undefined
  name: undefined,
  num1: undefined,
  num2: undefined,
  result: undefined
}

// console.log(window.window.window.window)

执行上下文栈(调用栈)

image-20230107101740896

image-20230107101808286

image-20230107101816683

遇到函数如何执行?

image-20230107115745052

02_全局代码执行过程

image-20230107122940647

var name = "why"

console.log(num1)

var num1 = 20
var num2 = 30
var result = num1 + num2

console.log(result)

/**
 * 1.代码被解析, v8引擎内部会帮助我们创建一个对象(GlobalObject -> go)
 * 2.运行代码
 *    2.1. v8为了执行代码, v8引擎内部会有一个执行上下文栈(Execution Context Stack, ECStack)(函数调用栈)
 *    2.2. 因为我们执行的是全局代码, 为了全局代码能够正常的执行, 需要创建 全局执行上下文(Global Execution Context)(全局代码需要被执行时才会创建)
 */
var globalObject = {
  String: "类",
  Date: "类",
  setTimeount: "函数",
  window: globalObject,
  name: undefined,
  num1: undefined,
  num2: undefined,
  result: undefined
}

// console.log(window.window.window.window)

image-20230107115850952

image-20230107115929659

03_全局代码执行过程(函数)

image-20230107113514754

var name = "why"

foo(123)
function foo(num) {
  console.log(m)
  var m = 10
  var n = 20

  console.log(name)
}


console.log(aaaaaaa)



/**
 * 1.代码被解析, v8引擎内部会帮助我们创建一个对象(GlobalObject -> go)
 * 2.运行代码
 *    2.1. v8为了执行代码, v8引擎内部会有一个执行上下文栈(Execution Context Stack, ECStack)(函数调用栈)
 *    2.2. 因为我们执行的是全局代码, 为了全局代码能够正常的执行, 需要创建 全局执行上下文(Global Execution Context)(全局代码需要被执行时才会创建)
 */
// var globalObject = {
//   String: "类",
//   Date: "类",
//   setTimeount: "函数",
//   window: globalObject,
//   name: undefined,
//   num1: undefined,
//   num2: undefined,
//   result: undefined
// }

// console.log(window.window.window.window)

// var GlobalObject = {
//   String: "类",
//   window: GlobalObject,
//   name: undefined,
//   foo: 
// }
 

04_全局代码执行过程(函数嵌套)-作用域的查找规则

// window本身有name值 会保存name
// var name = "why"
// name比较特殊--有些浏览器里面可能会内置name属性 --如果我们的global也没设置,可能也有name值
// var age = 100  //所以我们使用age也来做个测试,如果global也没设置,就会报错


foo(123)
function foo(num) {
  console.log(m)
  var m = 10
  var n = 20

  function bar() {
    console.log(111)
  }

  bar()
}

05_函数调用函数执行过程

函数的父级作用域和它定义的位置有关,和它调用的位置无关

image-20230107135351124

var message = "Hello Global"

function foo() {
  console.log(message)
}

function bar() {
  var message = "Hello Bar"
  foo()
}

bar()

变量环境和记录

image-20230107122144253

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NEUQ week10 题解

P1636 Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~,他希望用最少的笔画画出一张画…… 给定一个无向图,包含 nnn 个顶点(编号 1∼n1 \sim n1∼n),mmm 条边,求最少用多少笔可以画出图中…

对于NPS 的学习和认知

企业存在的唯一使命是创造顾客 —— 彼得德鲁克对于现代的多数组织而言,净推荐值(NPS)是一种衡量顾客满意度的“温度计”。NPS看似是一种管理工具,其实更多的是对企业基因的一种改变,其倡导的是内生性的问题&#xff0…

Java对象内存布局

对象内存构成 当我们在Java代码中创建对象后 会在堆中分配对应的内存 在 JVM 中,Java对象保存在堆中时,由以下三部分组成: 对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识…

概率论【随机事件和概率】--猴博士爱讲课

第一课 随机事件和概率 1/6 无放回类题目(一次摸多个) 例1.盒子里有3绿4红共7个小球,无放回的摸3个试求摸出1绿2红的概率例2.钱包里有3张100元,5张10元,3张5元的纸币,随机摸3张,试求摸出1张100,2张10的概率例1.盒子里…

【虚幻引擎】UE4 Http之异步请求数据

一、BlueprintAsyncActionBase UE提供了BlueprintAsyncActionBase类,实现异步加载的方式请求数据 虚幻的很多蓝图节点都采用了异步加载的方式 比如:延迟Delay,PlayMontage都是采用异步加载的方式进行实现 接下我们就用异步加载的方式实现HTT…

类和对象3

继承 继承是三大面向对象特征之一,继承无处不在,继承不仅是代码复用,精髓之处在于用抽象思维编写代码,以达到程序更强的可扩展性。 //继承一个父类,只能继承非私有的数据(属性和方法) //prote…

大数据之Kafka基本知识和架构介绍

文章目录前言一、Kafka的基本介绍(一)Kafka的特点二、Kafka的架构总结前言 #博学谷IT学习技术支持# 本篇文章主要从Kafka的基本介绍,Kafka的架构入手,如果有不恰当或者有疑问的地方,非常欢迎各位的意见和建议&#xf…

jetson连接PCF8591读取模拟电压值

文章目录一.PCF8591介绍PCF8591引脚说明PCF8591设置地址二.PCF8591模块功能描述:主要性能指标:三.PCF8591模块接口说明三.PCF8591连接jetson nano四.jetson nano 获取PCF8591模块的输入输出python版本代码C版本代码一.PCF8591介绍 PCF8591是一个单片集成、 单独供电、 低功耗、…

【Linux】Linux编译器—gcc/g++的使用

目录一.背景二.gcc如何生成1.预处理(进行宏替换)2.编译(生成汇编)3.汇编(生成机器可识别代码)4.链接(生成可执行文件或库文件)三.函数库1.函数库的分类(1)动态库(2)静态库2.区别3.拓展四.记忆1.选项2.后缀五.gcc选项该篇博客需要使用vim编译器&#xff0…

excel排序技巧:这些不同方式的排序方法你都会了么

都说这Excel里暗藏玄机,求最大值的MAX函数可以用于查找,用于查找的LOOKUP函数可以对数据进行四舍五入…就连看似人人都会的Excel自动排序,也藏着许多我们不知道的“小秘密”。今天我们就来探索一下这些藏在自动排序中的“小秘密”。一、扩展选…

Numpy数据分析csv文件的应用

1.数据存取与函数 1.1.数据的CSV文件存取 CSV(Comma-Separated Value,逗号分隔值) CSV是一种常见的文件格式,用来存储批量数据 np.savetxt(frame, array, fmt‘%.18e’, delimiterNone) 复制代码 frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩…

SpringCloud从入门到精通(七)

Gateway Gateway-概述 网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求…

【C++】优先级队列、仿函数和反向迭代器

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉priority…

工具及方法 - 字幕下载网站

1,射手网(伪) 首页 - 射手网(伪) - assrt.net - 字幕下载,字幕组,中文字幕,美剧字幕,英剧字幕,双语字幕,新番字幕 2,国外网站。 Subscene - Passionate abo…

sentinel-热点参数限流

Pages 60 Sentinel 官方网站 OpenSergo 微服务治理 文档 Read Me新手指南Sentinel 介绍FAQRoadmap如何使用工作原理流量控制集群流控(分布式流控)网关流控熔断降级热点参数限流系统自适应限流黑白名单控制实时监控数据动态规则控制台生产环境使用 Sent…

【自学Python】Python IDLE使用

Python IDLE使用 Python IDLE使用教程 在 Windows 上安装好 Python 之后,Python 都会提供一个 Python 命令行工具,就叫 IDLE。IDLE 是一个 Python Shell,Python Shell 可以用于与 Python 进行交互。 Python IDLE使用 打开Python IDLE 首…

分布式基础篇4 —— 基础篇完结(谷粒商城)

分类维护一、三级分类后端实现准备工作跨域问题关闭 ESLint 检查前端实现二、分类删除前端完善分类列表后端实现——删除配置发送请求代码片段前端实现——删除三、分类增加前端实现四、分类修改五、拖拽菜单拖拽效果实现拖拽数据收集拖拽功能完成拖拽功能完善六、批量删除品牌…

粒子系统-常用子模块

目录 Emission (发射) Shape (形状) Cone (锥形) Velocity over Lifetime (运动) Limit Velocity over Lifetime (速度限制) Force over lifetime (受力) Color over Lifetim…

【C语言航路】第十站:指针进阶(二)

目录 六、函数指针数组 七、指向函数指针数组的指针 八、回调函数 1.回调函数的概念 2.回调函数实现计算器 3.回调函数实现冒泡排序 总结 六、函数指针数组 我们已经知道了函数指针,它的类型是int(*)(int,int)。那么我们能否进行推广呢?将其推广成…

基于AD Event日志实时检测DSRM后门

01、简介每个域控制器都有一个目录还原模式(DSRM)帐户,它的密码是在安装域控时设置的,实际上它对应的就是sam文件里的本地管理员“administrator”,基本很少会被重置,因此有着极强的隐蔽性。攻击者通过获取…