美文网首页
this对象的指向

this对象的指向

作者: 刘越姐姐啊 | 来源:发表于2018-11-02 16:11 被阅读0次

    一般来说,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要的东西。

    相关文章

      网友评论

          本文标题:this对象的指向

          本文链接:https://www.haomeiwen.com/subject/auhxxqtx.html