关闭

JavaScript执行上下文

119人阅读 评论(0) 收藏 举报
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对象的各个属性进行赋值。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9075次
    • 积分:208
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:21篇
    • 译文:0篇
    • 评论:0条