JS the Hardcore: 执行上下文(Execution Context) (www.qianduan.net)

【简介】

首先需要澄清的一点是,像 C 和 Java 这类所谓的「静态语言」需要编译后才能运行,但其实 Javascript 一样也是有编译过程的, 只是处于一些限制,编译过程特别快(以微秒计),以至于感觉上 Javascript 代码好像并没有经过编译。

当需要向别人描述一件事情的经过时,往往需要把事情的前因后果以及与其相关的场景预先说明一下。 类似,EC 就是一段代码涉及到的场景,在代码运行之前,js engine 会做一些变量内存分配,代码上下文关联的准备工作,这就是 EC。 EC 是 Javascript 引擎实现的一个内部机制,不能在代码中直接访问到。

对编程语言来说,给变量赋值,获取变量的值,是需要解决的基本问题,Javascript 当然也不例外。 EC 中会给变量分配一个存储空间,与之对应的数据结构称作 enviroment。

当程序流程需要从当前的 EC 进入另外一个和当前上下文无关的代码片段时,会创建一个新的 EC,并被推入栈中。这就是「执行上下文栈」(Execution Context Stack),可以看作是 调用栈的镜像。由于所有的 js 代码都存在于全局环境中,所以首先会创建 「全局执行上下文」(Global Execution Context),除此之外,js 中每一次的函数调用也会生成 EC,所以栈底肯定会是 全局执行上下文。

如果把 EC 视为作一个抽象对象,那这个对象包含了代码相关的 this、enviroment(存储标识符包括变量声明、函数声明、函数表达式的数据结构)和一个指向外部 enviroment 的指针。

点击查看原文 >>

@技术头条 2017-02-20 00:03 / 0个评论
赞过的人: @技术头条
要不要再学学下面的文章?
以非阻塞方式执行一个函数 (blog.codingnow.com)
用过 skynet 的应该都碰到过:当我们在服务中不小心调用了一个长时间运行而不返回的 C 函数,会独占一个工作线程。同时,这个被阻塞的服务也无法处理新的消息。一旦这种情况发生,看似是无解的。我们通常认为,是设计问题导致了这种情况发生。skynet 的框架在监测到这种情况发生时,会输出 maybe in an endless loop 。

如果是 Lua 函数产生的死循环,可以通过发送 signal 打断正在运行运行的 Lua 虚拟机,但如果是陷入 C 函数中,只能事后追查 bug 了。

那么,如果我原本就预期一段 C 代码会运行很长时间,有没有可能从底层支持以非阻塞方式运行这段代码呢?即,在这段代码运行期间,该服务还可以接收并处理新的消息?
by @技术头条 2024-03-13 13:20 查看详情
如何利用「深度上下文兴趣网络」提升点击率? (tech.meituan.com)
美团到店广告平台在用户行为序列建模算法的迭代落地中,基于对业务实际场景中用户决策心智的观察,创新性地提出了深度上下文兴趣网络,精确建模了用户的兴趣,提升了CTR等线上业务指标。本文介绍了相应算法背后的动机、建模方法以及工程优化,希望能为从事相关工作的同学带来一些启发或帮助。
by @技术头条 2023-11-29 23:40 查看详情
架构设计 the Easy Way (blog.alswl.com)
前几日,我在团队内部举行了一场技术分享,我介绍了关于架构设计的最佳实践。将这些实践凝练成了 20 字口诀:架构看问题、需求看用例、设计看模型、细节看时序。

我将顺口溜转到了 Twitter,不少朋友对这些顺口溜产生了浓厚兴趣,希望深入了解。因此,我将我分享中的观点扩展成了这篇文章。
by @技术头条 2023-07-30 17:40 查看详情
可信执行环境之AMD内存加密技术概述 (blog.nsfocus.net)
本文将简单介绍主流可信执行环境技术之一的AMD内存加密技术,简述其技术架构、原理与应用场景。
by @技术头条 2023-01-04 23:42 查看详情
How to find the corresponding session in MogDB/openGauss from OS thread ID (www.dbform.com)
当MogDB数据库由于某种原因占用了较大的系统负载,比如CPU占用接近100%,那么如何知道到底是数据库里的哪个会话或者哪些会话占用了资源?
在Oracle数据库中,这样的问题诊断,通常都会关联 v$session, v$process, 以及操作系统top命令或者ps命令中查到的操作系统进程ID。
但是MogDB本身是线程模型,在操作系统上只能看到一个进程号,那么该如何定位问题?
by @技术头条 2022-07-31 23:50 查看详情
Webpack 打包后代码执行时机分析与优化 (www.alloyteam.com)
代码执行时机将决定着是否能够正常执行,当依赖文件没加载完成就开始执行、使用对应模块,那么将会导致执行异常。这在 “存在资源加载失败时,加载重试影响原来文件的执行顺序” 的场景下尤为常见。

webpack 构建除了进行模块依赖管理,实际上,也天然地管理了 entry 与 chunk 多文件的执行时机,但缺少了对 external 文件管理,当 external 文件加载失败或未完成时,执行、使用对应模块同样将导致异常。为此,wait-external-webpack-plugin 应运而生,以 webpack 插件的形式,补充 external 的执行管理。本文将进行简要说明。
by @技术头条 2022-07-24 21:17 查看详情
Ghost in the Log4Shell (insights.thoughtworks.cn)
核弹级漏洞 Log4Shell(CVE-2021-44228)的影响必将是深远的,不仅仅是当下肉眼可见的攻击事件和损失数据,在相当长时间的将来我们都会被这次的阴影所笼罩 – 蠕虫病毒和勒索软件的肆虐,个人敏感数据的大量泄漏。
by @Thoughtworks 2022-01-07 14:26 查看详情
MyBatis的执行流程,写得太好了! (mp.weixin.qq.com)
MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下:
by @code小生 2021-07-25 22:00 查看详情
Git 中上下文切换的 4 种方式 (linux.cn)
比较 Git 中四种切换分支的方法的优缺点。


所有大量使用 Git 的人都会用到某种形式的上下文切换。有时这只会给你的工作流程增加少量的开销,但有时,这可能是一段痛苦的经历。
让我们用以下这个例子来讨论一些常见的上下文切换策略的优缺点:

假设你在一个名为feature-X的分支中工作。你刚刚发现你需要解决一个无关的问题。这不能在feature-X分支中完成。你需要在一个新的分支feature-Y中完成这项工作。

方案 1:暂存 + 分支
解决此问题最常见的工作流程可能如下所示:

停止分支feature-X上的工作
git stash
git checkout -b feature-Y origin/main
一顿鼓捣,解决feature-Y的问题
git checkout feature-X或git switch -
git stash pop
继续在feature-X中工作
by @技术头条 2021-05-26 22:33 查看详情
用 Mars Remote API 轻松分布式执行 Python 函数 (developer.aliyun.com)
Mars 是一个并行和分布式 Python 框架,能轻松把单机大家耳熟能详的的 numpy、pandas、scikit-learn 等库,以及 Python 函数利用多核或者多机加速。这其中,并行和分布式 Python 函数主要利用 Mars Remote API。
by @可耐芊小仙女 2020-11-04 10:01 查看详情