资讯专栏INFORMATION COLUMN

彻底理解Javascript中的全局上下文

nifhlheimr / 1135人阅读

摘要:活动的执行上下文组在逻辑上组成一个堆栈。堆栈底部永远都是全局上下文,而顶部就是当前活动的执行上下文。一个抛出的异常如果没被截获的话也有可能从一个或多个执行上下文退出。相关代码执行完以后,只会包含全局上下文,一直到整个应用程序结束。

1 定义

每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文。执行上下文(简称-EC)是ECMA-262标准里的一个抽象概念,用于同可执行代码(executable code)概念进行区分。

标准规范没有从技术实现的角度定义EC的准确类型和结构,这应该是具体实现ECMAScript引擎时要考虑的问题。

活动的执行上下文组在逻辑上组成一个堆栈。堆栈底部永远都是全局上下文(global context),而顶部就是当前(活动的)执行上下文。堆栈在EC类型进入和退出上下文的时候被修改(推入或弹出)。

2 全局代码

全局代码不包括任何function体内的代码。

在初始化(程序启动)阶段,ECStack是这样的:

ECStack = [
  globalContext
];
3 函数代码

当进入funtion函数代码(所有类型的funtions)的时候,ECStack被压入新元素。需要注意的是,具体的函数代码不包括内部函数(inner functions)代码。如下所示,我们使函数自己调自己的方式递归一次:

(function foo(bar) {
 if (bar) {
 return;
}
foo(true);
})();

那么,ECStack以如下方式被改变:

// 第一次foo的激活调用

ECStack = [
 functionContext
globalContext
];

// foo的递归激活调用

ECStack = [
 functionContext – recursively
 functionContext
globalContext
];

每次return的时候,都会退出当前执行上下文的,相应地ECStack就会弹出,栈指针会自动移动位置,这是一个典型的堆栈实现方式。一个抛出的异常如果没被截获的话也有可能从一个或多个执行上下文退出。相关代码执行完以后,ECStack只会包含全局上下文(global context),一直到整个应用程序结束。

本文绝大多数内容参考自: http://www.cnblogs.com/TomXu/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86611.html

相关文章

  • 彻底理解Javascript中的变量对象

    摘要:活动对象的变化与处理上下文的两个阶段密切相关。所有变量声明由名称和对应值组成一个变量对象的属性被创建如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。 1 定义 如果变量与执行上下文相关,那变量自己应该知道它的数据存储在哪里,并且知道如何访问。这种机制称为变量对象(variable object)。变量对象(缩写为VO)是一个与执行上下文相关的特殊对象,...

    Shimmer 评论0 收藏0
  • JavaScript之例题中彻底理解this

    摘要:最后重点理解结论箭头函数的,总是指向定义时所在的对象,而不是运行时所在的对象。输出,箭头函数不会绑定所以传入指向无效。原因是,要彻底理解应该是建立在已经大致理解了中的执行上下文,作用域作用域链,闭包,变量对象,函数执行过程的基础上。 本文共 2025 字,看完只需 8 分钟 概述 前面的文章讲解了 JavaScript 中的执行上下文,作用域,变量对象,this 的相关原理,但是我...

    Hwg 评论0 收藏0
  • 彻底理解Javascript中的作用域链

    摘要:全局和上下文中的作用域链这里不一定很有趣,但必须要提示一下。全局上下文的作用域链仅包含全局对象。代码的上下文与当前的调用上下文拥有同样的作用域链。代码执行时对作用域链的影响在中,在代码执行阶段有两个声明能修改作用域链。 1 定义 我们已经知道一个执行上下文中的数据(参数,变量,函数)作为属性存储在变量对象中。 也知道变量对象是在每次进入上下文是创建并填入初始值,值的更新出现在代码执行阶...

    zhunjiee 评论0 收藏0
  • 彻底理解Javascript中的this

    摘要:构造函数中的当一个函数被作为一个构造函数来使用使用关键字,它的与即将被创建的新对象绑定。因此,如果传递的值是一个原始值比如或,那么就会使用相关构造函数将它转换为对象,所以原始值通过被转换为对象,而字符串使用转化为对象,例如方法引入了。 1 全局上下文中的this 在浏览器引擎的全局运行上下文中(在任何函数体外部),this 指代全局对象,无论是否在严格模式下。 use str...

    jcc 评论0 收藏0
  • 面向对象的 JavaScript

    摘要:是完全的面向对象语言,它们通过类的形式组织函数和变量,使之不能脱离对象存在。而在基于原型的面向对象方式中,对象则是依靠构造器利用原型构造出来的。 JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本文将回归面向对象本意,从对语言感悟的角度阐述为什...

    novo 评论0 收藏0

发表评论

0条评论

nifhlheimr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<