深入JavaScript的运行原理

news2024/11/25 6:43:28

1 深入V8引擎原理

2 JS执行上下文

3 全局代码执行过程

4 函数代码执行过程

5 作用域和作用域链

源代码->抽象语法树->字节码。

其中的字节码在函数执行的时候,由于参数的类型是一样的,所以有优化的机器码,但是如果参数类型发生变化,又要重新生成机器码然后优化(性能降低)。

有函数会被优先解析,其次是变量。就是下图这样子也能正常运行。如果还有一个变量叫bar的话函数会被参数覆盖,输出的是参数值。

下图是右边代码的初始状态的堆栈图(左边是上下文执行栈ECS;右边是GO、AO等等)

 这里执行到函数foo了,会创建AO,然后在绿色的块表示执行函数里面的每一行的过程。

 函数的代码里面的message打印如果是在赋值前,那么只要函数里面有这个参数的创建就会发生作用域的效果先在AO里面找,message打印为undefined。

 函数通过作用域链查找参数

作用域链在对象被创建的时候就已经确定了,而不是由你在哪里执行决定。

下图的foo函数

 函数里面嵌套函数的时候,执行上下文的过程

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script>

    // 1.面试题一:
    // var n = 100
    // function foo() {
    //   n = 200
    // }
    // foo()

    // console.log(n)

    // 2.面试题二:
    // var n = 100
    // function foo() {
    //   console.log(n)
    //   var n = 200
    //   console.log(n)
    // }

    // foo()

    // 3.面试题三:
    // var n = 100

    // function foo1() {
    //   console.log(n)
    // }
    // function foo2() {
    //   var n = 200
    //   console.log(n)
    //   foo1()
    // }
    // foo2()

    // 4.面试题四:
    // var n = 100
    // function foo() {
    //   console.log(n)
    //   return
    //   var n = 200
    // }
    // foo()

    // 5.在开发中可能会出现这样错误的写法,在函数里面定义了全局变量
    //这个变量在全局都能用。
    // function foo() {
    //   message = "Hello World"
    // }
    // foo()
    // console.log(message)

    // 6.面试题五: 这里的b相当于上面5的写法,虽然在函数里面定义了变量,却能在
    //全局使用这个变量。原因是没有声明这个变量。
    function foo() {
      var a = b = 100
    }
    foo()
    console.log(b)

  </script>

</body>
</html>

这里的js运行很复杂,一直创建对象,这是因为为了后续的闭包提供条件。

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

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

相关文章

昌平GPU集群使用指南 - 非官方版

昌平GPU集群使用指南 - 非官方版 可以在网址导航里看平台的使用指南&#xff0c;本文只是有益补充&#xff01; &#xff08;注&#xff1a;镜像只需要关闭&#xff0c;不需要删除&#xff09; 大致操作流程&#xff1a; 进入protainer&#xff0c;进入containers&#xff0c…

Docker删除镜像,以及导入/导出镜像

总结一下&#xff1a;删除镜像&#xff0c;以及导入/导出镜像的步骤和命令。 一、删除 1.docker rmi remove images。该命令用于删除本地镜像。 镜像通过 指定。如果省略要删除镜像的 tag&#xff0c;默认删除的是 lastest 版本。 比如&#xff1a;docker rmi zookeeper 2.删…

互联网干洗店软件及营销功能介绍

互联网干洗店洗衣洗鞋软件收件、充值、上挂等门店基本功能统统都有&#xff0c;更是支持多店互联互通&#xff0c;连接小程序、公众号&#xff0c;招揽线上生意。 为单店或多门店连锁的经营模式提供一整套的软件系统&#xff0c;包含微信公众号和小程序。 工厂版 为门店中央奢护…

接口测试面试题及答案

Http与Https的区别&#xff1a; Http与Https的区别&#xff1a; HTTP 的URL 以http:// 开头&#xff0c;而HTTPS 的URL 以https:// 开头HTTP 是不安全的&#xff0c;而 HTTPS 是安全的HTTP 标准端口是80 &#xff0c;而 HTTPS 的标准端口是443在OSI 网络模型中&#xff0c;HTTP…

JMeter变量和和属性(4)

这里写目录标题 一、JMeter变量1、使用JMeter变量的作用有&#xff1a;2、定义变量的方式3、引用变量的方式4、引用变量5、案例&#xff1a;切换GreaterWMS的环境6、案例&#xff1a;测试平台登录案例 二、JMeter属性1、JMeter属性特点2、JMeter属性和变量的区别&#xff1a;3、…

9.用python写网络爬虫,完结

前言 这是python网络爬虫的最后一篇给大家做个总结&#xff0c;且看且珍惜把&#xff01; 截止到目前&#xff0c; 前几章本书介绍的爬虫技术都应用于一个定制网站&#xff0c;这样可以帮助我们更加专注于学习特定技巧。而在本章中&#xff0c;我们将分析几个真实网站&#xff…

Python matplotlib 设置多子图、子图间距、边距

Python matplotlib 设置多子图 设置多子图间距 设置多子图边距 1. 方式一 设置一个 2*2 的子图&#xff0c;子图共用X轴&#xff0c;不共用Y轴 import matplotlib.pyplot as pltfig,axes plt.subplots(2,2,figsize(6,6),dpi100,facecolor"w",sharexTrue,shareyFal…

基于Java+Swing+Mysql员工信息管理系统

基于JavaSwingMysql员工信息管理系统 一、系统介绍二、功能展示1.主页2.查询员工信息3.删除员工信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看员工列表、查询员工信息、删除员工信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

【Java】Java核心 78:Git 教程(1)Git 概述

文章目录 01.GIT概述目标内容小结 02.GIT相关概念目标内容小结 01.GIT概述 Git是一个分布式版本控制系统&#xff0c;常用于协同开发和版本管理的工具。它可以跟踪文件的修改、记录历史版本&#xff0c;并支持多人协同工作。通过Git&#xff0c;你可以轻松地创建和切换分支、合…

Redis最基础内容

文章目录 一、Redis简介1、特点&#xff1a;2、优势 二、启动Redis三、数据类型0、通用命令1、String(字符串)2、Hash类型3、List类型4、Set&#xff08;集合&#xff09;5、zset(sorted set&#xff1a;有序集合)6、各个数据类型使用场景 四、SpringDataRedis1、RedisTemplate…

Yolov5优化: 多分支卷积模块RFB,扩大感受野提升小目标检测精度

目录 1.RFB-Net介绍 2. RFB引入到yolov5 2.1修改commmon.py 2.2 修改yolo.py 2.3 yolov5s_REF.yaml 1.RFB-Net介绍 论文&#xff1a;https://arxiv.org/pdf/1711.07767.pdf 代码&#xff1a;https://github.com/ruinmessi/RFBNet 受启发于人类视觉的Receptive Fields结构&…

String、StringBuffer和StringBuilder的区别(面试题)

目录 一、介绍String、StringBuffer和StringBuilder三大类 1.String类 2.StringBuffer类 3.StringBuilder类 4.什么是字符串常量池 4.StringBuilder类为什么不需要同步进行同步操作 二、关于String、StringBuffer和StringBuilder常见的面试题 1.为什么String是不可变的…

Flink入门学习(一)

Flink 1. 概述 分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架&#xff0c;用于对无界和有界数据流进行有状态计算。Flink 被设计在所有常见的集群环境中运行&#xff0c;以内存执行速度和任意规模来执行计算。 有界流&#xff1a;有定义流的开始&am…

Vue实例挂载的过程

一、思考与分析 我们都听过知其然知其所以然这句话 那么不知道是否思考过new Vue()这个过程中究竟做了些什么&#xff1f; 过程中是如何完成数据的绑定&#xff0c;又是如何将数据渲染到视图的等等 首先找到vue的构造函数 源码位置&#xff1a;src\core\instance\index.js…

高性能计算详细的自学方法及路线,强烈建议收藏!

一. 本文纲要 细想一下&#xff0c;其实无论是要自学高性能计算&#xff0c;还是要自学开车&#xff0c;无论我们要自学什么&#xff0c;都要弄明白以下几个问题&#xff1a;我们适不适合自学&#xff0c;怎么自学&#xff0c;从哪开始自学&#xff0c;自学到什么程度&#xff…

如何使用二维码实现业务流程闭环管理?

在日常工作中有许多业务流程需要进行跟踪记录&#xff0c;以确保掌握当前进度&#xff0c;譬如隐患上报整改、业务申请办理进度等&#xff0c;这时就可以应用二维码来实现业务流程的闭环管理。 通过草料二维码平台提供的表单功能&#xff0c;可以扫码提交表单记录&#xff0c;…

java之路 —— Shiro与Springboot整合开发

文章目录 前言一、基本开发步骤二、Springboot整合开发三、Shiro的集成四、测试 前言 在 Spring Boot 中做权限管理&#xff0c;一般来说&#xff0c;主流的方案是 Spring Security &#xff0c;但是&#xff0c;仅仅从技术角度来说&#xff0c;也可以使用 Shiro。 在 Spring…

MyBatisPlus基础功能使用

文章目录 MyBatisPlus基础功能CRUDBaseMapperServiceImpl 条件构造器注解一对多、多对一映射 MyBatisPlus基础功能 CRUD BaseMapper BaseMapper 接口是 MyBatis-Plus 提供的一个基础 Mapper 接口&#xff0c;它定义了一系列的通用数据库操作方法&#xff0c;包括插入、更新、…

项目——学生信息管理系统7

目录 学生选课功能的介绍 把 课程的数据库表创建出来 创建实体类 创建添加课程页面 AddCourseFrm&#xff0c;注意创建成JInternalFrame类型 页面制作&#xff0c;具体参照之前的 回到 MainFrm 添加课程管理菜单项 给添加课程按钮绑定事件 回到AddCourseFrm 页面 1. 把…

JSON百科全书:学习JSON看这一篇就够了

目录 1.1 JSON 简介 1.1.1 什么是 JSON 1.1.2 JSON 的特点 1.2 JSON 语法 1.2.1 JSON 键/值对 1.2.2 JSON 字符串 1.2.3 JSON 数值 1.2.4 JSON 对象 1.2.5 JSON 数组 1.2.6 JSON 布尔值 1.2.7 JSON null 1.2.8 JSON 文件 1.3 JSON 对象 1.3.1 访问对象的值 1.3…