自己来总结一下js中的this,这个this的指向一直都是一个很困扰的问题,老是搞不清楚如何来判断这个时候的this是指向什么的。我们要注意this的指向并不是在创建的时候决定的,而是在调用的过程中决定的。

首先要说明的是这里讨论的是非严格模式下的this指向,因为在非严格模式下this的默认指向是全局对象也就是我们常说的window,但是在严格版中,this的默认指向是undefined。

通过网上查阅我们可以看到很多文章对于this指向的总结就是实际上this的最终指向的是那个调用它的对象,这样的说法去分析大部分的this指向都是没有问题的,但是在有的时候这样去判定this的指向就会存在一定的问题。

function test(){ 
    var name = "5555";
    console.log(this.user); //结果undefined
    console.log(this);  //结果Window
}
test();

从上面这个例子我们可以看出,这里因为是全局中也就是window调用了这个函数,所以在这个函数里的this的指向就是window,这是符合上面的说法的。

var test={ 
    name: "5555";
    test1:function(){
        console.log(this.name);
        console.log(this);
    }
}
test.test1();//结果'5555' test
var x=test.test1;
x();//结果undefined window

这个例子我们能更好的去理解那句话:“this的指向不是创建的时候决定的,而是在调用时决定的”。这里声明x的时候并没有调用函数,只是进行了引用,当执行x()的时候才是真正的执行了这个test1里面的函数,因此所谓的调用是指的是在函数执行时的调用,这里是在window里执行的这个函数,因此这时this的指向自然就是window。
再看一个例子:

var test={ 
    name : "5555",
    test1:{
        name:'1111',
        test2:function(){
            console.log(this.name);
            console.log(this);
        }
    }
}
test.test1.test2();

这次的打印是什么呢?这次的this指向是什么呢?是window还是test,test1呢?打印结果是1111,this的指向是test1,这样我们就能进行一个this指向的基本总结了:
this的指向向就是看它被调用执行时的上一级,如果没有上一级(如这个this在函数中,然后全局调用了这个函数)那么它的指向就是window(非严格模式下),如果存在上级对象那么它的指向就是上一级的这个对象不论外面有多少层对象来调用了。

最后就是在一些特殊的情况下this的指向是被改变了的,有很多改变this的方法这里就不在叙述了。this在简单的情况下是很好判断指向的,但是在多次进行指向改变后,我们要去确定这个指向就比较困难。

参考文献:
https://www.cnblogs.com/pssp/...

这篇博客写的非常的简单易懂,虽然没有描述很复杂的情况,但是对于基本的this指向的总结是很到位的。


daijinjia
1 声望0 粉丝

« 上一篇
JS闭包
下一篇 »
git讲解