JavaScript ecma - 262 - 3中执行上下文的方法

  介绍

这篇文章主要讲解了JavaScript ecma - 262 - 3中执行上下文的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。


这篇文章我们主要探讨ECMAScript执行上下文和相关的ECMAScript可执行代码。

定义

每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文

执行上下文(简称中)是一个抽象概念,ecma - 262标准用这个概念同可执行代码(可执行代码)概念进行区分。

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

活动的执行上下文在逻辑上组成一个堆栈,堆栈底部永远都是全局上下文(全局上下文),堆栈顶部是当前(活动的)执行上下文。堆栈在EC类型的变量(EC)的各种广泛的被推入或弹出的同时被修改。

可执行代码

可执行代码的概念与抽象的执行上下文的概念是相对的。在某些时刻,可执行代码与执行上下文是等价的。

例如,我们可以定义一个数组来模拟执行上下文堆栈:

 ECStack=[]; 

每次进入函数(即使函数被递归调用或作为构造函数)的时候或者内置的 eval 函数工作的时候,这个堆栈都会被推入。

全局代码

这种类型的代码是在“程序“级处理的,例如加载外部的js文件或者本地的在& lt; script> & lt;/script>标签内的代码。全局代码不包括任何函数体内的代码。

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

ECStack=(   中   ];

函数代码

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

(函数foo (bar) {
  如果(bar) {
  返回;
  }
  foo(真正的);
  })();

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

//foo的第一个激活
  ECStack=[
  & lt; foo>functionContext
  中
  ];//递归激活foo
  ECStack=[
  & lt; foo>functionContext——递归
  & lt; foo>functionContext
  中
  ];

每次返回存在的当前执行上下文和ECStack弹出相应的执行上下文的时候,栈指针会自动移动位置,这是一个典型的堆栈实现方式。一个被抛出但是没有被截获的异常,同样存在一个或多个执行上下文。当相关段代码执行完以后,直到整个应用程序结束,ECStack都只包括全局上下文全局上下文( )。

Eval代码

, Eval 代码有点儿意思。它有一个概念:调用上下文(调用上下文),这是一个当 Eval 函数被调用的时候产生的上下文。 Eval (变量或函数声明)活动会影响调用上下文(调用上下文)

Eval (& # 39; var x=10 & # 39;);      (函数foo () {   eval (& # 39; var y=20 & # 39;);   })();      警报(x);//10   警报(y);//皔"以前没有定义

ECStack的变化过程:

函数foo () {
  var x=1;
  返回函数(){警报(x);};
  };
  
  var酒吧=foo ();
  
  酒吧();//1
  
  eval (& # 39; x=2 & # 39;, bar);//通过上下文,影响>看完上述内容,是不是对JavaScript ecma - 262 - 3中执行上下文的方法有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

JavaScript ecma - 262 - 3中执行上下文的方法