在《深入--词法作用域与动态作用域》中,提出这样一道思考题
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();
两段代码都会打印‘local scope’,虽然两段代码执行的结果一样,但是两段代码究竟有哪些不同呢?
紧接着就在《深入--执行上下文栈》中,讲到了两者的区别在于执行上下文栈的变化不一样,然而回答的太笼统,本片详细解析执行上下文栈和执行上下文具体变化过程
具体执行分析
第一段代码执行过程:
1.执行全局代码,创建全局执行上下文,全局执行上下文被压入执行上下文栈
ECStack = [ globalContext ];
2.全局上下文初始化
globalContext = { VO:[global,scope,checkscope], Scope:[globleContext.VO], this:globleContext.VO }
3.全局上下文初始化的同时,checkscope函数被创建,保存作用域链到函数的内部属性[[scope]]
checkscope.[[scope]] = [ globalContext.VO ];
4.执行checkscope函数,创建checkscope函数执行上下文,并压入栈
ECStack = [ checkscopeContext, globalContext ];
5.checkscope函数执行上下文初始化:
①复制函数[[scope]]属性创建作用域链
②用arguments创建活动对象
③初始化活动对象,即加入形参、函数声明、变量声明
④将活动对象压入checkscope作用域链顶端
同时f函数被创建,保存checkscope作用域链到f函数内部属性[[scope]]
checkscopeContext = { AO:{ arguments:{ length:0 }, scope:undefined, f:reference to function f(){} }, Scope:[AO,globalContext.VO], this:undefined }
6.执行f函数,创建f函数执行上下文并压入栈
ECStack = [ fContext, checkscopeContext, globalContext ];
7.f函数执行上下文初始化,跟上面一样:
①复制函数[[scope]]属性创建作用域链
②用arguments创建活动对象
③初始化活动对象,即加入形参、函数声明、变量声明
④将活动对象压入f作用域链顶端
fContext = { AO:{ arguments:{ length:0 } }, Scope:[AO,checkscopeContext.AO,globalContext.VO], this.undefined }
8.f函数执行,沿这作用域链查找scope值并返回
9.f函数执行完毕,f函数上下文从执行上下文栈中弹出
ECStack = [ checkscopeContext, globalContext ];
10.checkscope函数执行完毕,checkscope执行上下文从执行上下文栈中弹出
ECStack = [ globalContext ];
第二段代码就留给大家去尝试模拟它的执行过程
在下一篇《深入--闭包》中也会提及这段代码的执行过程
相关推荐
### JS上下文理解 #### 一、什么是JS执行上下文?...通过以上分析,我们可以更深入地理解JavaScript中执行上下文的概念及其如何影响变量的作用域和访问。理解这些基础概念对于掌握JavaScript编程至关重要。
JavaScript 执行上下文、函数堆栈、提升的概念是编程语言内部工作原理的重要组成部分。执行上下文可以理解为当前 JavaScript 代码被评估和执行时的一个环境,其中包含了变量、函数声明、作用域链以及 `this` 的值。...
理解和区分Linux内核中的进程上下文和中断上下文对于深入学习操作系统原理至关重要。进程上下文涉及的是进程在执行时的状态,包括寄存器值、状态信息和堆栈内容等;而中断上下文则是在硬件中断发生时,内核需要处理...
执行上下文是JavaScript引擎在解析和运行代码时的关键概念,它是理解JavaScript运行机制的基础。执行上下文(Execution Context,简称EC)是...深入理解执行上下文对于编写高效、无bug的JavaScript代码至关重要。
上下文切换是操作系统调度线程执行的一种机制,它涉及到保存当前线程的状态并恢复另一个线程的状态,以便线程可以在稍后时间点继续执行。这个过程对于理解多线程编程至关重要,因为它直接影响到程序的性能和资源消耗...
JavaScript的ECMA-262-3执行上下文是理解其运行机制的关键概念。执行上下文(Execution Context,简称EC)是JavaScript引擎处理代码的一种抽象方式。每次执行JavaScript代码时,都会创建一个新的执行上下文,它包含...
一 执行上下文? 1什么是执行上下文? 执行上下文就是当前的 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行的. 2 执行上下文的类型 执行上下文分为三种类型:...
理解执行上下文和执行栈对于深入学习JavaScript至关重要,因为它涉及到作用域、闭包、异步操作等复杂概念。例如,闭包是由函数和其相关的引用环境组合而成的实体,它能访问并操作其父函数的变量,即使父函数已经执行...
WinForm线程执行上下文流动是Windows Forms应用程序中多线程编程的一个重要概念。在Windows Forms环境下,UI(用户界面)线程与后台线程之间的交互必须谨慎处理,以确保线程安全和程序的响应性。这个源码可能提供了...
在深入探讨Linux内核中进程上下文和中断上下文的具体运作机制之前,我们首先需要理解这两个概念的基本含义及其重要性。进程上下文指的是在某一时刻,一个进程在执行过程中CPU的所有寄存器值、进程状态以及堆栈中的...
执行上下文(Execution Contexts,简称EC)是JavaScript语言的...总之,深入理解执行上下文是提升JavaScript编程技能的关键,它帮助开发者更好地理解和处理代码执行顺序、作用域规则以及`this`的动态绑定等复杂问题。
4. **绘图操作**:在不同的上下文中执行具体的绘图操作,例如绘制线条、形状、文本、图像等。Quartz 2D提供了丰富的API,如`CGContextSetFillColor`、`CGContextFillRect`、`CGContextDrawImage`等。 5. **结束图形...
中断上下文和进程上下文是处理器在执行任务时的不同状态。当CPU正在执行某个进程的代码时,我们称其处于进程上下文。在此状态下,CPU知道当前执行的是哪个进程,拥有该进程的上下文信息,如寄存器状态、程序计数器等...
在本教程中,我们将深入探讨如何在Android应用中创建和使用上下文菜单。 ### 创建上下文菜单 1. **注册上下文菜单**:首先,在你的Activity的`onCreate`方法中,通过调用`registerForContextMenu()`方法来注册需要...
作为一个前端开发人员,弄清楚JavaScript的执行上下文有助于我们理解js中一些晦涩的概念,比如闭包,作用域,变量提升等等。 执行栈 执行栈用于存储代码执行期间创建的所有执行上下文。具有FILO接口,也被称为调用...
所以 JavaScript 引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文为了模拟执行上下文栈的行为,让我们定
本篇将深入分析UCOSIII在基于Cortex-M3内核的处理器上的上下文切换机制。 Cortex-M3是ARM公司设计的一种高性能、低功耗的微控制器内核,广泛应用于各类嵌入式应用。UCOSIII在Cortex-M3上进行上下文切换,涉及到的...
函数内的递归调用导致执行上下文层层深入,直到遇到`a 的条件不满足,然后逐层返回,输出“出栈”信息,按照栈的特性,先入后出,最后恢复到全局执行上下文。 在创建阶段,执行上下文主要完成以下工作: 1. 初始化...
解压后,你可以通过阅读和运行这些代码,进一步学习和实践如何利用装饰器来跟踪Python函数的执行上下文。这将有助于你提升Python编程技能,特别是在开发和维护大型项目时,对函数执行情况有更细致的了解和控制。