javascript之this指针
this是与该执行上下文相关的特殊对象。因此,它可以称为上下文对象(比如,在执行上下文的对象就是激活对象)。
任何对象都可以被作为上下文的this的值。需要澄清一些错误的描述对于ECMAScript的执行上下文,和this的值。
经常,this的值,错误的描述成变量对象的属性。最近就在一本书就发现了这个错误(尽管,这本书的相关章节很不错)。
请牢记:
this 是该上下文的属性,而不是变量对象的属性。
这个特性很重要的,因为不同于变量,this 从不参与变量解释的过程。当在代码中访问this,它的值是直接从
该执行上下文取得的,不会从作用域里查找的。当进入到上下文时,this的值就会被唯一确定了。
顺便提一下,和ECMAScript对比,Python同样有自己的 self 参数作为简单的变量去解决这个问题,并且改变在执行期间。
在ECMAScript里,这是不可能的重新对this赋值,因为,重复一下,它不是一个变量,也不属于变量对象。
在全局上下文,this 的值是全局对象自己(这就是说,this的值在这里是等于变量对象的):
var x = 10; console.log( x, // 10 this.x // 10 window.x // 10 );
对于函数的上下文,this的值在每个单一函数可以不同的。this的值是由那调用者来决定的通过调用函数表达式(比如,
函数的调用方式)。举个例子, 函数 foo 是被调用者,是被全局上下文调用的,这个上下文是调用者。让我们一起看看,
对于同一个函数,通过不同的调用者,this的值是怎么不同的:
// the code of the "foo" function //never changes, but the "this" value //differs in every activation function foo(){ alert( this ); } foo(); // global object foo.prototype.constructor(); // foo.prototype var bar = { baz: foo }; bar.baz(); // bar (bar.baz()); // also bar (bar.baz = bar.baz)(); // but here is global object (bar.bar, bar.bar)(); //also global object (false || bar.baz)(); //also global object var otherFoo = bar.baz(); otherFoo(); // again global object