首页 > 语言 > JavaScript > 正文

JavaScript ECMA-262-3 深入解析.第三章.this

2024-05-06 14:23:34
字体:
来源:转载
供稿:网友
介绍
在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。
实践证明,这个主题很难,在不同执行上下文中确定this的值经常会发生问题。
许多程序员习惯的认为,在程序语言中,this关键字与面向对象程序开发紧密相关,其完全指向由构造器新创建的对象。在ECMAScript规范中也是这样实现的,但正如我们将看到那样,在ECMAScript中,this并不限于只用来指向新创建的对象。
下面让我们更详细的了解一下,在ECMAScript中this的值到底是什么?
定义
this是执行上下文中的一个属性:
代码如下:
activeExecutionContext = {
VO: {...},
this: thisValue
};

这里VO是我们前一章讨论的变量对象。
this与上下文中可执行代码(的类型)直接相关。this的值在进入上下文时确定,并且在上下文运行代码期间不会改变this的值。
下面让我们更详细研究这些场景。
this在全局代码中的值
在这里一切都很简单。在全局代码中,this始终是全局对象本身,这样就有可能间接的引用到它了。
代码如下:
// explicit property definition of
// the global object
this.a = 10; // global.a = 10
alert(a); // 10
// implicit definition via assigning
// to unqualified identifier
b = 20;
alert(this.b); // 20
// also implicit via variable declaration
// because variable object of the global context
// is the global object itself
var c = 30;
alert(this.c); // 30

this在函数代码中的值
在函数代码中使用this时很有趣,这种应用场景很难且会导致很多问题。
在这种类型的代码中,this值的首要(也许是最主要的)特点是它没有静态绑定到一个函数。
正如我们上面曾提到的那样,this的值在进入上下文时确定,在函数代码中,this的值每一次(进入上下文时)可能完全不同。
不管怎样,在代码运行期间,this的值是不变的,也就是说,因为this不是一个变量,所以不可能为其分配一个新值。(相反,在Python编程语言中,它明确的定义为对象本身,在运行期间可以不断改变)。
代码如下:
var foo = {x: 10};
var bar = {
x: 20,
test: function () {
alert(this === bar); // true
alert(this.x); // 20
this = foo; // error
alert(this.x); // if there wasn't an error then 20, not 10
}
};
// on entering the context this value is
// determined as "bar" object; why so - will
// be discussed below in detail
bar.test(); // true, 20
foo.test = bar.test;
// however here this value will now refer
// to "foo" – even though we're calling the same function
foo.test(); // false, 10

那么,在函数代码中,什么影响了this的值发生变化?有几个因素。
首先,在通常的函数调用中,this是由激活上下文代码的调用者来提供的,即调用函数的父上下文(parent context)。this取决于调用函数的方式。(译者注:参考这里)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选