一般来说,this的指向是指谁调用的方法this就是指向谁(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在理解this的时候会有种琢磨不透的感觉)
例子1:
function a(){
var obj="哈哈哈";
console.log(this.obj);//undefined
console.log(this);//window
}
a();
按照上面的说法这里的this最终指向的是调用它的对象,由于这里的函数a是被window对象调用的,所以 console.log(this)的时候打印出window,而 console.log(this.obj)的时候由于obj参数只存在于函数a里面,而window下并没有obj参数,所以打印出来是undefined
function a(){
var obj="哈哈哈";
console.log(this.obj); //undefined
console.log(this); //Window
}
window.a();
这段代码就可以看出来和上面的代码的执行结果是一样的。
例子2:
var o = {
obj:"哈哈哈",
fn:function(){
console.log(this.obj);//哈哈哈
}
}
o.fn();
还是通过上面的结论,由于函数fn是通过o.fn()执行的,那自然指向就是对象o,而对象o中确实是存在obj的,所以打印出来就是对象o里面的obj的内容也就是‘哈哈哈’,同时从这里我们也能看出来,this的指向在函数创建的时候是决定不了的,只有在函数调用的时候才能决定,谁调用的就指向谁,这一点是很重要的,一定要记住。
但是要搞清楚this还要看接下来的几个例子:
例子3:
var o = {
obj:"哈哈哈",
fn:function(){
console.log(this.obj);//哈哈哈
}
}
window.o.fn();
例子3几乎和例子2是一样的,只是最后一句在调用函数的时候不太相同,但是通过打印的结果可以看出来,这里的this指向的还是对象o,如果按照一开始的理论,this指向的调用它的对象,那这里应该是指向window对象,为什么没有呢???(ps:window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window.o.fn来调用函数)
在解释这为什么不指向window之前,我们再来看一段代码:
var o = {
a:10,
b:{
a:20;
fn:function(){
console.log(this.obj);//20
}
}
}
o.b.fn();
这里同样是对象o调用的函数fn,但是同样的,this对象也没有指向o,而是指向对象b,是因为我们一开始说的谁调用的方法this就是指向谁是错误的吗,其实也不是,只是说的不准确,所以要对这个结论进行补充,才能彻底的理解this的指向问题。
情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window。
情况2:如果一个函数中有this,这个函数有被上一级函数所调用,那么this指向的就是上一级的对象。
情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。
所以这也就解释了上面的例子3,在例子3中,虽然最后一句是window.o.fn(),看上去是window调用的fn,但是实际上this对象并不指向window而是指向函数fn的上一级的对象o。下面这个例子就是一个很好的证明。
var o = {
a:10,
b:{
// a:20;
fn:function(){
console.log(this.obj);//undefined
}
}
}
o.b.fn();
这里可以看到,尽管对象b中没有属性a,这里的this也是指向对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。
网友评论