本文通过四个小demo来了解this的指向,如有不足或错误的地方,请指教。
- 1、 首先全局定义一个变量a=2;
2、再定义一个对象obj,里面有属性a=2,和方法b()。
var a = 2;
var obj = {
a:1,
b:function(){
return function(){
console.log(this.a);
}
}
}
看一下测试结果。
因为obj.b()会返回一个函数,执行代码obj.b()()相当于返回一个匿名函数,由window调用,即window调用函数,this此时指向window
- 1、定义一个对象obj1,在b方法中使用打印this.a的值。
var obj1 = {
a:3,
b:function(){
console.log(this.a);
}
}
查看测试结果
因为调用b方法的是对象obj1,所以this指向obj1,故打印this.a就是obj1.a的值了。
- 1、定义对象obj2
2、在obj2里声明一个self属性,使其赋值为this
3、通过b方法,打印self.a,查看结果
var obj2 = {
a:4,
self:this,
b:function(){
console.log(self.a);
}
}
查看测试结果
结果显示,直接调用obj2.b(),发现self还是指向window,证明,this在定义的时候是指向window。
- 1、定义对象obj3,定义属性a的值为4
2、obj3对象中,定义方法b(),并且在b方法中,定义一个变量a = 5;
var obj3 = {
a:4,
b:function(){
var a = 5;
console.log(this.a);
}
}
查看测试结果
结果显示,调用obj3.b(),this.a打印的是obj3.a,而不是obj3.b()方法里定义的变量a。
总结
- this总是指向最近调用方法的对象。
- this在定义的时候是指向定义此段代码的作用域