变量对象(Variable Object)

问题:web

  1. 声明函数和变量发生了什么细节?函数

  2. 解析器如何而且在什么地方查找这些声明的函数和变量?this

  3. 引用这些对象会发生什么?spa

知识点:对象

变量对象(Variable Object - VO)是执行上下文的一个属性(property、特殊对象):生命周期

  1. 存储着在上下文中函数的形参、函数声明(FunctionDeclaration - FD)和声明的变量(var,变量声明)字符串

  2. 在具体执行上下文中,VO名称是不同的,初始结构也不同;it

  3. 全局上下文变量对象(GlobalContextVO)和函数上下文变量对象(FunctionContextVO)之分。io

---全局上下文中的变量对象function

  1. 全局对象(Global object)是在进入任何执行上下文以前就已经建立的对象,该对象只存在一份,它的属性在程序中任何地方访问,全局对象的生命周期终止于程序退出那一刻。

  2. 在DOM中,全局对象的window属性引用了全局对象自身,当访问全局对象的属性时一般会忽略前缀,由于全局对象事不能经过名字直接访问的(如Math,String,Date等~),不过能够经过全局上下文的this来访问全局对象,而在window中,变量对象就是全局对象即VO(globalContext)=== global。

---函数上下文中的变量对象

  1. 活动对象(activation object - AO)在函数执行上下文中,VO是不可能直接访问的,此时由活动对象AO扮演VO的角色;经过函数的arguments属性(值为Arguments对象)初始化。

  2. Arguments对象包括:

    • callee(指向当前函数的引用);

    • length(真正传递的参数个数)

    • properties-indexes(字符串类型的整数)属性的值就是函数的参数值(按参数列表从左到右排列)。properties-indexes内部元素的个数等于Arguments.length.properties-indexes的值,和实际传递进来的参数之间是共享的。

-------------

处理代码分两个阶段:

  1. 未执行代码以前,进入执行上下文建立相关意见声明的属性;

  2. 执行代码

---进入执行上下文

  1. 函数的全部形参(若是此时在函数执行上下文中):按名称和对应值的形式建立变量对象的属性,若是没有传递对应参数,则值为undefined ;

  2. 全部函数声明(FunctionDeclaration, FD):按名称和对应值(函数对象function-object)的形式建立变量对象的属性,若是已经存在相同名字的变量(变量没赋值),代之;

  3. 全部变量声明(var, VariableDeclaration):按名称和对应值(undefined)的形式建立变量对象的属性,若是已经存在相同名字(形参或者函数)的属性,不代之 。

---代码执行

  1. 在代码执行前,VO/AO已经拥有了属性,但大部分属性仍是系统默认的初始值undefined;

  2. 代码执行时,会相应的填充VO/AO中相应属性的值来计算结果。

-------------

关于变量

  1. 任什么时候候只有经过var才能声明的变量,根据VO的相关要点,未经过var声明的变量在执行代码以前不会被包含到VO中;

  2. 经过var才能声明的变量不能被delete。

---函数中,形参与变量

  • 若是函数内部声明的变量与形参同名,但变量未赋值,则变量形参同值

  • 若是函数内部声明的变量已经赋值了,形参没法改变其值

  • arguments能够获取到形参的值。

相关文章
相关标签/搜索