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
原文地址:https://www.cnblogs.com/branches/p/4888509.html