js面试---闭包、作用域及作用域链、执行上下文

1、什么是闭包

        闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。 

        闭包的作用:

                a、使我们在函数外部能够访问到函数内部的变量。通过使用闭包,可以通过在外部调用闭包函数,从而在外部访问到函数内部的变量,使用这种方法来创建私有变量

                b、使已经运行结束的函数上下文中的变量对象继续留在内存中

function A() {let a = 1window.B = function () {console.log(a)}
}
A()
B() // 1

2、对作用域、作用域链的理解

(1)全局作用域

  • 最外层函数和最外层函数外面定义的变量拥有全局作用域
  • 所有未定义直接赋值的变量自动声明为全局作用域
  • 所有window对象的属性拥有全局作用域
  • 全局作用域有很大的弊端,过多的全局作用域变量会污染全局命名空间,容易引起命名冲突。

(2)函数作用域

  • 函数作用域声明在函数内部的变零,一般只有固定的片段可以访问到
  • 作用域是分层的,内层作用域可以访问外层作用域,反之不行

(3)块级作用域 

  • 使用ES6中新增的let和const指令可以声明块级作用域,块级作用域可以在函数中创建也可以在一个代码块中的创建(由{ }包裹的代码片段)
  • let和const声明的变量不会有变量提升,也不可以重复声明
  • 在循环中比较适合绑定块级作用域,这样就可以把声明的计数器变量限制在循环内部。

(4)作用域链

        在当前作用域中查找所需变量,但是该作用域没有这个变量,那这个变量就是自由变量。如果在自己作用域找不到该变量就去父级作用域查找,依次向上级作用域查找,直到访问到window对象就被终止,这一层层的关系就是作用域链。

        作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,可以访问到外层环境的变量和函数。

        作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。

        当查找一个变量时,如果当前执行环境中没有找到,可以沿着作用域链向后查找。

3、对执行上下文的理解

        a. 执行上下文类型

(1)全局执行上下文

任何不在函数内部的都是全局执行上下文,它首先会创建一个全局的window对象,并且设置this的值等于这个全局对象,一个程序中只有一个全局执行上下文。

(2)函数执行上下文

当一个函数被调用时,就会为该函数创建一个新的执行上下文,函数的上下文可以有任意多个。

(3)eval函数执行上下文

执行在eval函数中的代码会有属于他自己的执行上下文,不过eval函数不常使用,不做介绍。

        b. 执行上下文栈

(2)创建词法环境组件

(3)创建变量环境组件

2)执行阶段

此阶段会完成对变量的分配,最后执行完代码。

简单来说执行上下文就是指:

在执行一点JS代码之前,需要先解析代码。解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。这一步执行完了,才开始正式的执行程序。

在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。

  • JavaScript引擎使用执行上下文栈来管理执行上下文
  • 当JavaScript执行代码时,首先遇到全局代码,会创建一个全局执行上下文并且压入执行栈中,每当遇到一个函数调用,就会为该函数创建一个新的执行上下文并压入栈顶,引擎会执行位于执行上下文栈顶的函数,当函数执行完成之后,执行上下文从栈中弹出,继续执行下一个上下文。当所有的代码都执行完毕之后,从栈中弹出全局执行上下文。
    c. 创建执行上下文

    创建执行上下文有两个阶段:创建阶段执行阶段

    1)创建阶段

    (1)this绑定

  • 在全局执行上下文中,this指向全局对象(window对象)
  • 在函数执行上下文中,this指向取决于函数如何调用。如果它被一个引用对象调用,那么 this 会被设置成那个对象,否则 this 的值被设置为全局对象或者 undefined
  • 词法环境是一种有标识符——变量映射的数据结构,标识符是指变量/函数名,变量是对实际对象或原始数据的引用。
  • 词法环境的内部有两个组件:加粗样式:环境记录器:用来储存变量个函数声明的实际位置外部环境的引用:可以访问父级作用域
  • 变量环境也是一个词法环境,其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。
  • 全局上下文:变量定义,函数声明
  • 函数上下文:变量定义,函数声明,thisarguments

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

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

相关文章

道可云元宇宙每日资讯|济南起步区:加快建设元宇宙政务大厅

道可云元宇宙每日简报(2024年4月23日)讯,今日元宇宙新鲜事有: 济南起步区:加快建设元宇宙政务大厅 济南起步区以“元宇宙”赋能智慧政务,集成政务服务智能办理、数字人智能引导交互服务、沉浸式漫游体验、…

【学习记录】autoware标定相机与激光雷达外参

一、autoware选择 这里踩了好几个坑,首先autoware作为一个无人驾驶知名框架,其内部实际上是有两套标定的东西的,这一点绝大多数博客没有提到。其中最常用的是一个叫标定工具箱的东西,这个ros包已经在1.10往后的版本中被删掉了&am…

hive SQL谓词下推

Sql 优化:谓词下推(PPD 定义 谓词下推的概念其实出现在sql中,在关联查询时(join,left join ,right join),因为涉及两个大表之间的关联(特别是在hive)造成资源消耗会比较大, 因为建议在join之前先将两个表进行过滤(hive…

Android 获取sha1的快速有效的简单方法

第一步 下载apk 点击下载(https://download.csdn.net/download/xiaohui2015/9751428) 第二步 试用Windows键R键打开命令行 输入 adb install把apk用鼠标左键拖动到命令行自动输入路径 回车安装 第三步 打开apk 选择你要查看的apk,一键…

Spring 1、初识Spring

初识Spring 了解Spring家族了解Spring发展史Spring Framework系统架构学习路线 了解Spring家族 官网spring.io Spring形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。 Spring Framework(最基础的东西&#x…

qemu参考

手把手教你搭建ARM64 QEMU环境 - 知乎

SpringCloud Alibaba--nacos配置中心

目录 一.基础介绍 1.1概念 1.2 功能 二.实现 2.1 依赖 2.2 新建配置文件 2.3 克隆 2.4 配置bootstap.yml文件 三.测试 一.基础介绍 1.1概念 在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。把传统的单体jar包拆分成多个微服务后&#xf…

NameError: name ‘_mysql‘ is not defined 安装mysqlclient报错

安装mysqlclient报错 The error message you’re seeing indicates that the pkg-config utility is not installed on your system, or it is not able to find the necessary configuration for mysqlclient. pkg-config is used to determine the compilation options for …

跨越未知,拥抱挑战——新征程

在浩瀚的IT领域里,每一位开发工程师都如同一位探险家,不断地探索、挑战和成长。作为一名新入职的Java开发工程师,我面临着全新的技术栈和业务领域,这是一次跨越未知的征程,也是一次自我提升的机会。 新入职 初入公司…

Android活动之Intent

Intent Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景, 显示intent 第一个参数Context要求提供…

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 数据模型方法V2 微搭简介 微搭(WeDa),全称是腾讯云微搭低代码开发平…

设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

【Python】深入解析Python中的eval()函数

你是魔鬼中的天使 所以送我心碎的方式 是让我笑到最后一秒为止 才发现自己胸口插了一把刀子 你是魔鬼中的天使 让恨变成太俗气的事 从眼里流下谢谢两个字 尽管叫我疯子 不准叫我傻子 🎵 田馥甄《魔鬼中的天使》 Python的eval()函数是一个强大而…

Powershell 一键安装 virtio_qemu_agent

前言 qemu-guest-agent qemu-guest-agent是一个助手守护进程,安装在客户机中。它用于在主机和客户端之间交换信息,并在客户端执行命令。 在Proxmox VE中,qemu-guest-agent主要用于三件事: 正确关闭客户机,而不是依赖于ACPI命令或windows策略在进行备份/快照时冻结客户机…

plt.show()输出<Figure size 1200x800 with 1 Axes>没有展示出图片在notebook里

解决方法如下: 在Jupyter Notebook中,如果使用plt.show()没有直接显示图像,可能是由于某些设置或限制导致的。您可以尝试使用%matplotlib inline魔术命令来确保图像能够直接显示在Notebook中。请在Notebook的第一个单元格中执行以下命令&…

世界首台能探测单个原子的量子模拟器,诞生!

量子物理学依赖于高精度的传感技术,以便深入研究材料的微观特性。近期开发的模拟量子处理器显示出量子气体显微镜在原子层面理解量子系统方面的强大潜力。这种显微镜可以生成极高分辨率的量子气体图像,甚至能够检测到单个原子。 在西班牙巴塞罗那的ICFO&…

flutter android studio升级java java17

oricle 网站下载jdk 17sudo dpkg -i 安装包。到android-studio 目录, mv jbr jbr_bak ln -s /usr/lib/jvm/jdk-17-oracle-x64 jre ln -s /usr/lib/jvm/jdk-17-oracle-x64 jbr 更新.bashrc里面 JAVA_HOMEusr/lib/jvm/jdk-17-oracle-x64 jresource .bashrc然后运行f…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作,需要一个小型的封装晶体振荡器来提供参…

书生·浦语大模型第二期实战营第六节-Lagent AgentLego 智能体应用搭建 笔记和作业

来源: 视频教程:Lagent & AgentLego 智能体应用搭建 文字教程: Lagent Web Demo:https://github.com/InternLM/Tutorial/blob/camp2/agent/lagent.md#1-lagent-web-demo AgentLego: https://github.com/Inter…

ComfyUI学习旅程

一、模型文件(Checkpoint) 首先它很大,这些文件是你从huggingface或者civitai下载而来的, 所以这些大文件如 .ckpt 或 .safetensors ,实际上包含了什么内容呢? 它包含了包含了三种不同模型的权重&#x…