this对象的指向

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

推荐阅读更多精彩内容

  • JavaScript中的this指向问题有很多博客在解释,仍然有很多人问。上周我们的开发团队连续两个人遇到相关问题...
    一个敲代码的前端妹子阅读 277评论 0 5
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    子涵传媒阅读 1,828评论 0 12
  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 77,488评论 25 510
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 4,321评论 2 16
  • 葡萄藤PPT JS中this的指向 大家好,我是IT修真院郑州分院第6期的学员王栋,一枚正直、纯洁、善良的前端程序...
    17064阅读 200评论 0 2