JS基本知识

news2024/11/18 19:43:09

JS作用域的内存模型

每个函数都有各自的作用域、作用域链、变量对象、执行环境。 
一、函数初始化:3作用域链。

  • 函数被调用:1作用域、2变量对象、4执行环境。
  • 执行结束后,1作用域、3作用域链、4执行环境被销毁、2变量对象(如果函数内部有闭包变量对象仍然留在内存)。
  • 等到闭包执行结束,该变量对象将被销毁。

1.作用域

函数:当前执行的函数能够访问到变量的范围

变量:变量可以活动的范围

2.变量对象

每个函数都会创建各自的变量对象。

作用域:存储的变量对象的引用;

变量对象:存储函数局部变量。

3.作用域链

把多个作用域串起来便形成了作用域链;

函数初始化:生成作用域链(不包含自己的作用域);

函数被调用:创建自己的作用域,并加入到作用域链的开头;

作用域链中不仅存储了函数本身的作用域,还存储了该函数能够访问的其他函数的作用域。

4.执行环境

所有的执行环境会存放在执行环境栈(执行环境栈顶表示当前正在执行的环境)中,只有栈顶的执行环境才有执行权。

每个正在执行的函数都有一个执行环境,记录了函数执行过程中的各项信息。 
除了全局执行环境外,其余函数的执行环境都随着函数的执行而被创建,随着函数的执行结束而被销毁。 

var 全局变量 = "柴毛毛";

function 外层函数(){

    var 局部变量1 = "大闲人";

    return function(){

        var 局部变量2 = "是傻逼";

        return 全局变量+局部变量1+局部变量2;

    };

}

var 函数 = 外层函数();

函数();

  • 初始化全局执行环境
  1. 创建全局变量对象。
  2. 创建全局作用域链。该作用域链中只包含一个全局变量对象作用域链中通过指针指向全局变量对象。
  3. 创建外层函数的作用域链。只包含外层函数父级函数的作用域链。
  4. 创建全局执行环境。将全局执行环境压入执行环境栈,并通过一个指针指向它的作用域链。 

  • 调用外层函数
  1. 创建外层函数的变量对象“局部变量1”和匿名函数
  2. 将当前函数的作用域添加到当前函数作用域链的顶部。也就是把先前创建的“外部函数作用域链”中第一个作用域的指针指向“外部函数变量对象”,第二个指针指向“全局变量对象”。
  3. 创建外层函数中匿名函数的作用域链即图中的闭包作用域链。
  4. 将“外层函数的执行环境”压入执行环境栈的顶部。并指向外层函数的作用域链。

  • 调用闭包(即匿名函数)
  1. 销毁“外层函数”的作用域链和执行环境。但不销毁闭包需要用到的外层函数的变量对象。
  2. 创建闭包的变量对象。
  3. 创建闭包的作用域,并压入闭包作用域链的头部。
  4. 将“闭包的执行环境”压入执行环境栈的顶部。并指向闭包的作用域链。
  5.  只有当闭包执行结束后,“外层函数的变量对象”才会被释放,否则它将一直驻留内存,这也就是为什么闭包会比普通函数占用更多的内存。

补充:

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

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

相关文章

【前后端的那些事】文件上传组件封装

文章目录 效果前端代码后端代码组件封装 效果 前端代码 /views/file/file.vue <template><el-row><el-uploadv-model:file-list"fileList"class"upload-demo"multiple:auto-upload"false":on-preview"handlePreview"…

Java SpringBoot 整合 MyBatis 小案例

Java SpringBoot 整合 MyBatis 小案例 基础配置&#xff08;注意版本号&#xff0c;容易报错&#xff09; pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

面试经典150题 -- 二叉树搜索树 (总结)

总的链接 : https://leetcode.cn/studyplan/top-interview-150/ 二叉搜索树相关概念 : 二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结…

SWIFT:自我认知微调

文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E8%87%AA%E6%88%91%E8%AE%A4%E7%9F%A5%E5%BE%AE%E8%B0%83%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.md ​​​​​​代码: Swift是如何把自我认知数据集融合到训练集中呢? 1:相关的3个参数

阿里云ECS u1实例性能怎么样?199元一年

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候&#xff0c;问到许多年轻的Android开发他所会的设计模式是什么&#xff0c;基本上都会提到单例模式&#xff0c;但是对单例模式也是一知半解&#xff0c;在Android开发中我们经常会运用单例模式&#xff0c;所以我们还是要更了解单例模式才对…

SQL注入漏洞解析--less-46

我们先看一下46关 他说让我们先输入一个数字作为sort,那我们就先输入数字看一下 当我们分别输入1&#xff0c;2&#xff0c;3可以看到按照字母顺序进行了排序&#xff0c;所以它便是一个使用了order by语句进行排序的查询的一种查询输出方式 当输入时出现报错提示&#xff0c;说…

YOLOv9图像标注和格式转换

一、软件安装 labelimg安装&#xff08;anaconda&#xff09; 方法一、 pip install labelImg 方法二、 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i ht…

【迪文屏幕】上电后默认显示背景图片是0

以往的开发&#xff0c;背景图片都是从0开始命名的&#xff0c;这次鬼使神差的没有使用0&#xff0c;而是从1开始命名&#xff0c;上电后不显示&#xff0c;咨询了技术支持&#xff0c;屏幕上电后默认显示0图片&#xff0c;增加了0图片之后&#xff0c;显示正常。 当然有一种情…

浅谈 TCP 三次握手

文章目录 三次握手 三次握手 首先我们需要明确&#xff0c;三次握手的目的是什么&#xff1f; 是为了通信双方之间建立连接&#xff0c;然后传输数据。 那么建立连接的条件是什么呢&#xff1f; 需要确保通信的双方都确认彼此的接收和发送能力正常&#xff0c;满足这个条件&a…

PDF文件转换为图片

现在确实有很多线上的工具可以把pdf文件转为图片&#xff0c;比如smallpdf等等&#xff0c;都很好用。但我们有时会碰到一些敏感数据&#xff0c;或者要批量去转&#xff0c;那么需要自己写脚本来实现&#xff0c;以下脚本可以提供这个功能~ def pdf2img(pdf_dir, result_path…

通过二叉树例题深入理解递归问题

目录 引入&#xff1a; 例1&#xff1a;二叉树的前序遍历&#xff1a; 例2&#xff1a; N叉树的前序遍历&#xff1a; 例3&#xff1a;二叉树的最大深度&#xff1a; 例4&#xff1a;二叉树的最小深度 例5&#xff1a;N叉树的最大深度&#xff1a; 例6&#xff1a;左叶子…

Python实用技巧:处理JSON文件写入换行问题

Python实用技巧&#xff1a;处理JSON文件写入换行问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

springboot启动自动配置

1.自定义项命名启动类规范&#xff1a; 功能在前名字在后比如 aliyun-oss-spring-boot-starter starter表示启动 springboot版本需要2.7.5 2.创建springboot工程把该删除的文件删除 3.启动类 pom文件导入自定义配置类依赖 比如 <!--第2步--><!-- 启动类 pom…

CSP-202209-3-防疫大数据

CSP-202209-3-防疫大数据 解题思路 一、数据结构定义 对于大模拟的题&#xff0c;合适的数据结构选择十分重要&#xff0c;正确的数据结构选择能够有效的提升解题效率 // 漫游消息结构体 struct RoamingData {int date, user, region; };vector<RoamingData> roamin…

阿里云服务器2024年最新价格表,高性价比配置任你选

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始选择云服务器来搭建自己的业务平台。作为国内领先的云服务提供商&#xff0c;阿里云一直致力于为广大用户提供稳定、高效、安全的云计算服务。2024年&#xff0c;阿里云再次升级其服务器产品线&#xff0c;推出了…

FMM 笔记:st-matching(colab上执行)【官方案例解读】

在colab上运行&#xff0c;所以如何在colab上安装fmm&#xff0c;可见FMM 笔记&#xff1a;在colab上执行FMM-CSDN博客 st-matching见论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST-matching&#xff09;-CSDN博客 0 导入库 from…

MySQL 数据优化技巧:提升百万级数据聚合统计速度

MySQL 数据优化技巧&#xff1a;提升百万级数据聚合统计速度 MySQL 数据优化技巧&#xff1a;提升百万级数据聚合统计速度摘要引言索引优化1. 使用合适的索引类型2. 聚簇索引的应用 查询优化3. 减少数据检索范围4. 避免全表扫描 数据库设计优化5. 合理划分数据表6. 使用分区表 …

nginx设置缓存时间

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

面试经典150题【11-20】

文章目录 面试经典150题【11-20】388.O(1) 时间插入、删除和获取随机元素238.除自身以外数组的乘积134加油站135.分发糖果42. 接雨水13.罗马数字12.整数 转 罗马数字58.最后一个单词的长度14.最长公共前缀151.反转字符串中的单词 面试经典150题【11-20】 388.O(1) 时间插入、删…