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

ops/2024/9/23 0:04:43/

1、什么是闭包

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

        闭包的作用:

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

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

javascript">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.ppmy.cn/ops/14507.html

相关文章

微带线设计细节的模拟仿真分析

微带线设计在很多PCB设计场景中被应用,但是,有些工程师往往并不注重设计细节,导致最后的设计指标与预期相差甚远,比如设计中,会将丝印、散热金属等放在走线的上方,设计检查时会有人产生质疑,至于…

Spring Boot集成zipkin快速入门Demo

1.什么zipkin Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。Zipkin默认支持Http协议&…

全国各省市建设工程类专业职称评审要求总结(欢迎补充完善、沟通交流)

全国各省市建设工程类专业职称评审要求汇总统计如下,总体来说北京最难,经济欠发达、偏远地区评审要求相对简单,每个地方的要求存在一定的相似性,但又都各具特色,基本上来说论文是评审的必备条件,但是各个地…

网络初识

网络 局域网 一个区域的网 广域网 相对概念,没有绝对的界限,全世界现在最大的广域网,就教做TheInternet,万维网 路由器 交换机和路由器,都是用来组建网络的重要设备 交换机 上网的设备(电脑/手…

Okapi Framework

文章目录 关于 OkapiRainbowCheckMateRatelTikalFilters Plugin for OmegaTLonghorn 关于 Okapi 官网:http://okapiframework.org源码:https://bitbucket.org/okapiframework/okapi/src文档:http://okapiframework.org/wiki/index.php?titl…

Python重点数据结构基本用法

Python重点数据结构用法 运算符描述[] [:]下标&#xff0c;切片**指数~ -按位取反, 正负号* / % //乘&#xff0c;除&#xff0c;模&#xff0c;整除 -加&#xff0c;减>> <<右移&#xff0c;左移&按位与^ < < > >小于等于&#xff0c;小于&#…

人工智能数据防泄露解决方案

需求背景 人工智能三大核心要素&#xff1a;算法、算力、数据。除了算法、算力外&#xff0c;最重要核心因素是数据。实现人工智能有两个阶段&#xff0c;即准备数据与训练模型。数据准备工作量占比达 70% 以上&#xff0c;但更重要的数据背后的人工&#xff0c;即数据预处理、…

倍思、南卡、漫步者开放式耳机好不好用? 硬核测评年度最强产品

​在开放式耳机市场的竞争日益加剧的今天&#xff0c;各品牌在硬件配置、功能及性价比上都在进行着激烈的角逐。不论是业界的领军品牌还是新兴的挑战者&#xff0c;他们无一例外地致力于推出更高水准的耳机&#xff0c;以迎合消费者的需求。作为一位经验丰富的耳机评测师&#…