96SEO 2026-02-19 16:38 14
家好笔者呢最近再回顾JavaScript知识时又看到了JavaScript的一些较为常见的内容仔细看了之后发现之前理解的并不深所以给记录了下来加深印象。

执行上下文与执行栈、作用域与作用域链、闭包。
执行上下文例题大家先来看一道较为简单的题看下是否能看出来结果var
输出结果复制代码大家可以看出来输出结果是什么吗如果你已经算出来的话那么说明你对执行上下文还是有一些理解的欢迎继续往下看加深印象如果你没算出来或者输出结果与你算的不相符那也先不要着急先看下边内容看完后再回来算概念大家都知道JavaScript代码的在运行的时候都是自上而下按顺序执行的但是呢实际并非是一行一行的执行那大家有没有了解过它在执行代码的时候做过哪些准备做过哪些事情比如代码解析、分配内容都是在哪处理的那这个地方呢就是执行上下文是准备工作的所在环境执行上下文类型执行上下文呢有三种类型分别是全局执行上下文函数执行上下文还有就是eval函数执行上下文那么我们继续执行上下文呢是在代码编译阶段创建的来看看执行上下文的生命周期执行上下文生命周期创建阶段执行阶段创建阶段执行上下文的创建阶段具体做了什么事呢又分为三部分ExecutionContext
复制代码确定this指向在全局执行上下文中this指向的是全局对象在函数执行上下文中this指向取决于该函数是如何被调用的看下这个democonst
代码的词法嵌套结构来定义标识符和具体变量和函数的关联。
一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成。
简单来说词法环境是一种持有标识符—变量映射的结构。
这里的标识符指的是变量/函数的名字而变量是对实际对象[包含函数类型对象]或原始数据的引用。
现在在词法环境的内部有两个组件(1)
一个外部环境的引用。
环境记录器是存储变量和函数声明的实际位置。
外部环境的引用意味着它可以访问其父级词法环境作用域。
词法环境有两种类型全局环境在全局执行上下文中是没有外部环境引用的词法环境。
全局环境的外部环境引用是
Object/Array/等、在环境记录器内的原型函数关联全局对象比如
this的值指向全局对象。
在函数环境中函数内部用户定义的变量存储在环境记录器中。
并且引用的外部环境可能是全局环境或者任何包含此内部函数的外部函数。
环境记录器也有两种类型如上声明式环境记录器存储变量、函数和参数。
对象环境记录器用来定义出现在全局上下文中的变量和函数的关系。
简而言之在全局环境中环境记录器是对象环境记录器。
在函数环境中环境记录器是声明式环境记录器。
注意
length。
抽象地讲词法环境在伪代码中看起来像这样GlobalExectionContext
Globalorouterfunctionenvironmentreference}
复制代码变量环境它同样是一个词法环境其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。
如上所述变量环境也是一个词法环境所以它有着上面定义的词法环境的所有属性。
在
中词法环境组件和变量环境的一个不同就是前者被用来存储函数声明和变量let
复制代码执行上下文看起来像这样GlobalExectionContext
undefined。
这是因为在创建阶段时引擎检查代码找出变量和函数声明虽然函数声明完全存储在环境中但是变量最初设置为
的变量会得到一个引用错误。
这就是我们说的变量声明提升。
执行阶段这是整篇文章中最简单的部分。
在此阶段完成对所有这些变量的分配最后执行代码。
注意
undefined。
执行栈那根据上述执行上下文的理解那我们知道在执行代码中会有很多的执行上下文那么执行上下文是怎么确定执行顺序的。
执行上下文存放的位置就是在执行上下文栈也叫调用栈。
具有LIFOLast
Out后进先出也就是先进后出的特性。
那我们来看下之前的例题来分析下var
输出结果复制代码首先进入全局执行环境创建全局执行上下文环境并加入栈中fn()函数被调用进入对应的函数执行环境创建函数执行环境并加入栈执行
b);代码出栈fn()函数执行完毕后出栈fn1()函数被调用进入对应的函数执行环境创建函数执行环境并加入栈继续fn()函数被调用进入对应的函数执行环境创建函数执行环境并加入栈执行
b);代码出栈fn()函数执行完毕后出栈fn1()函数出栈全局执行上下文出栈题解那我们再来分析下例题的答案var
复制代码所以此时输出结果为10020作用域例题大家先来看下下边的题看下是否能看出来结果var
20;console.log(1000)returnfunction()
复制代码大家可以看出来输出结果是什么吗概念作用域是可访问的变量对象函数的结合同时也决定了这些变量的可访问性。
JavaScript中有三种作用域分别是全局作用域函数作用域块级作用域。
那就来聊聊这三种作用域全局作用域什么是全局作用域呢先来看下概念最外层的函数和在最外层函数外面定义的变量是拥有全局作用域的所有的未声明的变量自动声明为拥有全局作用域的变量我们开来接着看下上边例题var
100;console.log(1000)returnfunction()
复制代码那我们根据上述概念来分析下变量a呢是拥有全局作用域的全局变量是可以在程序任何位置都可以访问到的函数fn也是拥有全局作用域的函数接着来看下输出结果fn();
应该都会吧函数作用域来看下函数作用域的概念函数作用域呢也被称为局部作用域因为一般只有在固定的代码片段中可以访问到也就是说只能在函数内部访问函数外部是访问不到的。
那我们接着来看下上述例题相信小部分人是卡在console.log(b)这个输出结果上了没关系继续往下看var
100;console.log(1000)returnfunction()
复制代码来继续根据函数作用域的概念来分析下变量b呢是在函数内部所以称为局部变量只能在函数内部访问外部是无法访问的那根据这个解释看的话这个输出结果就很明显了吧var
defined复制代码那么现在知道为什么console.log(b);输出结果是b
defined了吗块级作用域我们来看看块级作用域的概念简单来说变量是存在于一个大括号之内在大括号之外是不能访问这些块级作用域中的变量当然是有局限性的只针对于ES6
中的const与let来说因为呢在ES6之前呢JavaScript是没有块级作用域的那继续看例题例题中有let声明的变量var
20;是在大括号中的变量那根据概念括号外是无法访问的那也应该知道答案是什么了吧console.log(d);
defined复制代码那最后在回头看初始例题是不是一切都变的很简单最后输出结果var
是输出不了结果的因为上一步已经报错了console.log(d);
20;console.log(1000)returnfunction()
复制代码其中console.log(a)输出a那这个a是在哪里来的因为在一般的情况下会在当前作用域中取值那在当前作用域没找到的话会去上级作用域中寻找一直到找到全局作用域。
这么一个寻找的过程中呢就会形成一个链条就叫做作用域链总结作用域是可访问的变量对象函数的结合同时也决定了这些变量的可访问全局作用域是说在最外层的函数以及不在任何函数或者打括号中声明的变量都在全局作用域下程序中任务位置都可以访问的变量函数作用域呢是变量声明在函数中只能在函数内部访问函数外部是访问不到的块级作用域呢是说对于ES6
中的const与let来说在大括号之内的变量是存在于块级作用域中的大括号之外不能访问这些块级作用域中的变量作用域链在寻找变量值的时候层层往上形成的链条闭包例题大家先来看下这道题看下是否能看出来输出结果var
输出结果复制代码优雅永不过时答对了说明你对闭包还是有一定研究的没答对的继续往下看概念那我们先来看看闭包的概念什么是闭包看看MDN与高级程序设计给出的概念能够访问其它函数内部变量的函数称为闭包能够访问自由变量的函数称为闭包分析那我们来分析下上边的例题在分析之前你需要对作用域以及执行上下文有一定的了解如果不太明确的话可以优先看下这两篇文章再继续阅读下面内容var
输出结果复制代码首先我们记录下这道例题的执行上下文栈的变化首先进入了全局执行上下文然后创建全局执行上下文将全局上下文放入执行上下文栈中然后继续初始化执行全局上下文创建作用域链以及变量对象等那么此时的全局上下文VO为globalContext
复制代码执行data[0](),然后创建data[0]()执行上下文继续放入执行上下文栈内然后呢初始化data[0]()执行上下文创建作用域链以及变量对象等那么此时的data[0]()AO为data[0]Context
复制代码那么此时的data[0]()作用域链为data[0]Context
复制代码因为在data[0]Context活动对象AO中是没有i值的所以去全局上下文的变量对象中查找此时全局上下文的变量对象中i值为3所以data[0]()输出结果为3执行完毕后在data[0]()执行上下文在执行上下文栈给弹出至于data[1]()与data[2]()与步骤3-5是一样的所以在这就不多说了场景至于闭包的使用场景其实在日常开发中使用到是非常频繁的防抖节流函数定时器回调等就不一一列举了优缺点优点闭包帮我们解决了什么问题呢内部变量是私有的可以做到隔离作用域保持数据的不被污染性缺点同时闭包也带来了不小的坏处说到了它的优点内部变量是私有的,可以做到隔离作用域,那也就是说垃圾回收机制是无法清理闭包中内部变量的那最后结果就是内存泄漏大厂面试题分享
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback