对于this在不同场景的指向,往往搞不清楚到底指向谁。在函数定义的时候确定不了它的指向,只有函数执行的时候才能确定this到底指向谁,实际上只需要记住一点:this始终指向调用它的对象。
1. 普通函数运行时,全局调用则this指向window
function foo() {
var a = 1;
console.log(this.a);
}
var a = 2;
foo(); // 2
按照this最终指向的是调用它的对象,这里的函数foo的调用属于全局调用,因此this指向window。
function foo() {
var a = 1;
console.log(this.a);
}
var a = 2;
window.foo(); // 2
2. 函数被调用时是被对象调用,则this指向调用它的对象
var obj1 = {
fn: function(){
console.log(this.bar);
},
bar : 1
}
bar = 2;
obj.fn(); // 1
var obj2 = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a);
}
}
}
obj2.b.fn(); // 12
这里对象中的方法中的this,指向调用它的对象,即 b ,所以输出结果是b对象中的a的值;
3.作为构造函数调用时,this指向实例对象
function foo(name,age){
this.name = name;
this.age = age;
}
var ab = new foo('QG',18);
console.log(ab.name); // QG
这里的方法作为构造函数调用,ab是被new出来的实例对象,所以这里this指向实例对象ab。
4.apply和call中的this指向参数中的对象
var a = 10;
var foo = {
a: 20,
fn: function(){
console.log(this.a);
}
};
var bar ={
a: 30
}
foo.fn.apply();//10(若参数为空,默认指向全局对象)
foo.fn.apply(foo);//20
foo.fn.call(bar);//30