最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript变量对象其二:VO在不同的执行上下文中

来源:懂视网 责编:小采 时间:2020-11-27 20:30:30
文档

JavaScript变量对象其二:VO在不同的执行上下文中

JavaScript变量对象其二:VO在不同的执行上下文中:不同执行上下文中的变量对象对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函数上下文中也定义和变量对象相关的额外内容。抽象变量对象VO (变量初始
推荐度:
导读JavaScript变量对象其二:VO在不同的执行上下文中:不同执行上下文中的变量对象对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函数上下文中也定义和变量对象相关的额外内容。抽象变量对象VO (变量初始

不同执行上下文中的变量对象

对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函数上下文中也定义和变量对象相关的额外内容。

抽象变量对象VO (变量初始化过程的一般行为)
 ║
 ╠══> 全局上下文变量对象GlobalContextVO
 ║ (VO === this === global)
 ║
 ╚══> 函数上下文变量对象FunctionContextVO
 (VO === AO, 并且添加了<arguments>和<formal parameters>)

我们来详细看一下:

全局上下文中的变量对象

首先,我们要给全局对象一个明确的定义:

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

全局对象初始创建阶段将Math、String、Date、parseInt作为自身属性,等属性初始化,同样也可以有额外创建的其它对象作为属性(其可以指向到全局对象自身)。例如,在DOM中,全局对象的window属性就可以引用全局对象自身(当然,并不是所有的具体实现都是这样):

global = {
 Math: <...>,
 String: <...>
 ...
 ...
 window: global //引用自身
};

当访问全局对象的属性时通常会忽略掉前缀,这是因为全局对象是不能通过名称直接访问的。不过我们依然可以通过全局上下文的this来访问全局对象,同样也可以递归引用自身。例如,DOM中的window。综上所述,代码可以简写为:

String(10); // 就是global.String(10);
 
// 带有前缀
window.a = 10; // === global.window.a = 10 === global.a = 10;
this.b = 20; // global.b = 20;

因此,回到全局上下文中的变量对象——在这里,变量对象就是全局对象自己:

VO(globalContext) === global;

非常有必要要理解上述结论,基于这个原理,在全局上下文中声明的对应,我们才可以间接通过全局对象的属性来访问它(例如,事先不知道变量名称)。

var a = new String('test');
 
alert(a); // 直接访问,在VO(globalContext)里找到:"test"
 
alert(window['a']); // 间接通过global访问:global === VO(globalContext): "test"
alert(a === this.a); // true
 
var aKey = 'a';
alert(window[aKey]); // 间接通过动态属性名称访问:"test"

函数上下文中的变量对象

在函数执行上下文中,VO是不能直接访问的,此时由活动对象(activation object,缩写为AO)扮演VO的角色。

VO(functionContext) === AO;

活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象:

AO = {
 arguments: <ArgO>
};

Arguments对象是活动对象的一个属性,它包括如下属性:

callee — 指向当前函数的引用

length — 真正传递的参数个数

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

例如:

function foo(x, y, z) {
 
 // 声明的函数参数数量arguments (x, y, z)
 alert(foo.length); // 3
 
 // 真正传进来的参数个数(only x, y)
 alert(arguments.length); // 2
 
 // 参数的callee是函数自身
 alert(arguments.callee === foo); // true
 
 // 参数共享
 alert(x === arguments[0]); // true
 alert(x); // 10
 
 arguments[0] = 20;
 alert(x); // 20
 
 x = 30;
 alert(arguments[0]); // 30
 
 // 不过,没有传进来的参数z,和参数的第3个索引值是不共享的
 z = 40;
 alert(arguments[2]); // undefined
 
 arguments[2] = 50;
 alert(z); // 40
}
 
foo(10, 20);

这个例子的代码,在当前版本的Google Chrome浏览器里有一个bug — 即使没有传递参数z,z和arguments[2]仍然是共享的。

文档

JavaScript变量对象其二:VO在不同的执行上下文中

JavaScript变量对象其二:VO在不同的执行上下文中:不同执行上下文中的变量对象对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函数上下文中也定义和变量对象相关的额外内容。抽象变量对象VO (变量初始
推荐度:
标签: vo 上下 javascript
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top