JavaScript执行上下文

原创 2016年05月30日 17:42:07
1.JavaScript的作用域有三种,全局作用域、函数作用域以及eval()作用域
对于函数来说,上下文环境是在调用时创建的,每次函数调用时,都会有一个对应的执行环境(执行上下文);
①对于全局作用域,在执行第一行代码前也会存在一个全局的执行上下文,
②对于同一个函数,在被调用多次的时候,每次都会有不同的执行上下文环境,重复调用一万次函数,就会创建一万个这个函数的执行上下文。

2.JavaScript如何找到我们定义的函数与变量?
①变量对象(Variable Object VO)是一个抽象概念中的"对象",它用于存储执行上下文中的变量、函数声明与函数参数(若是函数作用域就会有函数参数)。
当声明一个变量和函数后,全局作用域的执行上下文就会在全局上下文的变量对象中存储全局的变量与函数;而在函数的执行上下文中,变量对象存储了函数的形式参数与函数中声明的变量。

②事实上,在JavaScript的第一行代码开始就可以调用Math/String/isNaN等方法,也可以拿到window对象,这是因为在全局作用域下,拥有一个全局的变量对象。在第一行代码执行之前,JavaScript引擎会将全局的方法属性等初始化到全局的变量对象中。这个对象拥有一个window属性,指向他本身。(因此可以无限循环的window.window.window.window.....)

我们平时使用的全局的方法或对象,如String(10);window.a=1;this.b=2;等等操作,实际上都是在间接的接触全局环境的变量对象。它们的背后就是VO([[global]])对象,而String()或Math等方法,实际上是VO对象的属性。
String(10);   //实际操作 →  [[global]].String(10)
this.b=2;      //实际操作 → [[global]].b=2;
window.a=1;//实际操作→[[global]].window.a=1;


同样的,在访问函数执行上下文中的变量时,实际上在变量的背后有它的变量对象VO。

③函数中的激活对象
函数调用时,会存在一个AO(激活对象),在函数调用时,会有一个arguments,arguments在初始化阶段会被放置在AO对象中,初始化完成后,AO对象又会被叫做VO对象。(函数中AO和VO是一个对象)

(1)对函数中的AO而言,它存在两个阶段,第一阶段是变量初始化阶段
在函数的变量初始化阶段会对arguments初始化,并将变量声明与函数声明放入激活对象中。步骤如下
▶将函数参数置入VO对象(若未传入参数,则将参数值初始化为undefined)
▶将函数声明置入VO对象(若发生命名冲突,则覆盖以前的声明)
▶将变量声明置入VO对象(初始化变量值为undefined,若发生命名冲突,则忽略此次声明)


AO对象的变量初始化阶段中,如果遇到命名冲突:
①如果函数声明发生命名冲突,函数声明会覆盖以前的声明

②如果变量声明发生冲突,变量声明会被忽略

③若变量声明后有赋值语句,则代码执行阶段会为变量赋值,

④函数表达式中的的函数名不会影响VO对象,函数表达式的声明会在变量声明阶段取得undefined,在第二阶段会赋值为这个命名函数_e。

(2)完成变量初始化阶段后,会进入代码执行阶段。
(function x(){})这个函数表达式没有被调用因此会被忽略,而其余变量的值相当于为VO对象的各个属性进行赋值。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JavaScript执行上下文

在JavaScript中有三种代码运行环境: ● 全局代码(Global Code) : ○ JavaScript代码开始运行的默认环境 ● 函数代码(Function Co...

深入理解javascript原型和闭包(8)——简述【执行上下文】上

原文地址:http://www.cnblogs.com/wangfupeng1988/p/3986420.html 什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码:...

深入理解JavaScript系列 ----(11):执行上下文(Execution Contexts)

简介 从本章开始,我将陆续(翻译、转载、整理)http://dmitrysoshnikov.com/网站关于ECMAScript标标准理解的好文。 本章我们要讲解的是ECMAScript标...

深入理解javascript原型和闭包(11)——执行上下文栈

继续上文的内容。 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执...

了解JavaScript的执行上下文

在这篇文章里,我将深入研究JavaScript中最基本的部分——执行上下文(execution context)。读完本文后,你应该清楚了解解释器做了什么,为什么函数和变量能在声明前使用以及他们的值是...

深入理解javascript原型和闭包(9)——简述【执行上下文】下

继续上一篇文章(http://www.cnblogs.com/wangfupeng1988/p/3986420.html)的内容。 上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数...

深入理解javascript原型和闭包(11)——执行上下文栈

执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执行上下文环境只有一个...

javascript this 和执行上下文 之大不同

1.2 this 和执行上下文 在前面讨论封装时,我们已经接触过 this 了。在对封装的讨论中,我们看到的 this 都是表示 this 所在的类的实例化对象本身。真的是这样吗? 先看一...

javascript的函数执行上下文及this

Functions and execution contexts in JavaScript Publicado el 24/2/2011 por Sergio Cinos Senior ...

深入理解JavaScript内部原理(1): 执行上下文

概要  在这篇文章中,我们将向大家介绍ECMAscript的可执行上下文以及相关的可执行上下文的类型 定义 每当控制器进入ECMAscript可执行代码的时候,控制器就进入了一个可执...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)