在Java等其他面向对象语言中,关键字this指向的是类的当前实例,在js中,this的值是由函数的调用上下文以及调用位置所决定的。
1. 当this用于全局上下文中:如果是在全局上下文中使用this,它就会被绑定在全局上下文。比如在浏览器中,全局上下文通常是window。对于函数来说也是如此。如果是在定义全局上下文的函数中使用this,它依然被绑定在全局上下文,因为该函数是全局上下文的一部分:
function globalAlias(){
return this;
}
2. 当this用于对象的方法中:在这种情况下,this被赋值或绑定到包含对象上。注意,如果对象存在嵌套的话,包含对象就是那个直接的父对象。
var f = {
name = "f",
func:function(){
return this;
}
};
console.log(f.func());
//prints -
//[object object]{
// func:function(){
// return this;
// },
// name:"f"
// }
3. 如果不存在上下文:当一个函数不跟随任何对象调用的时候,就不会有上下文。默认情况下,它会被绑定到全局上下文。如果在这种函数中使用this,它就会绑定到全局上下文。
4. 当this用于构造函数中:我们之前已经看到过,当函数使用关键字new来调用时,它就会被作为构造函数使用。在构造函数中,this指向被构造的对象,在下面的例子中,f()是构造函数(因为是通过关键字new调用的),因此this指向的就是被创建出的新对象。当我们使用this.member = 'f'时,新的member属性就被添加到新创建的对象中,在这个例子中,新对象就是o:
var member = "global";
function f(){
this.member = "f";
}
var o=new f();
console.log(o.member);
如果实例和原型中都定义了相同的属性,会优先使用实例属性。