JavaScript中this的指向问题

    javaScript中的this指向在函数定义的时候是无法确定的,只有函数执行的时候才能确定this指向谁,从简单来说,谁调用了this,this就指向谁,但是也有特殊情况,在经验中会有记录。

    第一个栗子,证明谁调用this,this指向谁:

    function pointerTest(){
        var apple = "an apple";
        console.log(this.apple);
        console.log(this);
    }   

    调用:

 pointerTest();

    控制台输出:

  undefined   
    Window

    原因分析:
    按照上面说的,this指向的是调用它的对象。pointerTest()是一个全局函数,默认是被Window对象调用的,因此在函数内的this指向Window对象,又因为Window对象没有apple这个属性,所以控制台第一行输出undefined。第二行输出this的时候也证明了此时this指向的是Window。
    
    第二个栗子,证明谁调用this,this指向谁:

  var apple = {
      color:"red",
      getColor:function(){
          console.log(this.color);
      }
   }

    调用:

  apple.getColor();

    控制台输出:

   red

    原因分析:
    apple对象有2个属性,color和getColor,其中color是一个字符串类型的属性,getColor是一个匿名方法。当apple对象调用了匿名方法的时候,this指针指向apple,执行匿名方法时打印this对象的color属性,也就是apple的color属性。因此打印出red。
  至此,可能有小伙伴会恍然大明白:"懂了懂了,谁调的就指向谁"。那来看两个特殊点的栗子,证明你懂了。


    第三个栗子:

    var man ={
        sex:"男",
        getSex:function(){
            console.log(this.sex);
        },
        wife:{
            sex:"女",
            getSex:function(){
                console.log(this.sex);
            }
        }
    }

    调用:

man.wife.getSex();

   控制台输出: 

    答案分析:
    你的答案应该也是这样的,因为哪怕你不知道this的指向单纯从伦理角度也能分析出来,哈哈。但是我们再用之前的结论(谁调用了this,this就指向谁)来捋一捋,首先man对象调用了wife,此时this指的是man,然后又调用了getSex,但却没输出"男",说明this的指向发生了变化指向了wife,不信的话在“console.log(this.sex);”下再加一行输出“console.log(this);”可以证明这一点。再分析之前的结论好像有些不准确,this的指向应该是它的直接调用对象。再总结一下应该是:"谁直接调用了this,this就指向谁,多层级连续调用时,this的指向会发生变化。"

   
    再来一个更复杂一些的栗子:

    var man ={
        sex:"男",
        getSex:function(){
            console.log(this.sex);
        },
        wife:{
            sex:"女",
            getSex:function(){
                console.log(this.sex);
            }
        }
    }

 (嗯?你是不是在逗我,这个不还是上一个栗子么!别急,看下调用有何不同。)
    
    调用:

    var m = man.wife.getSex;
    m();

   控制台输出: 

  undefined

   
    结果分析:
    能想明白不?没有的话再分析一下这句话"谁直接调用了this,this就指向谁,多层级连续调用时,this的指向会发生变化。" 起初,man用.字符调用了wife,此时this指向man,得到了man的wife。之后wife用.字符"调用"了getSex(注意这里没有加括号,相当于获得了getSex这个方法,而并未执行它。所以我给调用2个字加了引号,因为这样形容并不准确。)再然后把getSex方法赋给了m这个变量,this就又指向了m。最后m执行的时候,m是一个全局变量,this指向的是window,因此想打印出window的sex属性自然得到的是"undefined "啦。

    最后一个栗子(且吃且珍惜呀,哈哈):

    function Apple(){
        this.color = "red";
        return;
    }

    调用:

   var a = new Apple();
   console.log(a.color);

    控制台输出:  

 red

    结果分析:
    呦?加个new关键字就不一样了?没错!就是不一样了,new关键字用于创建一个新的对象,并且把这个新的对象指向赋予的变量。此时a和Apple()是等价的,因此a.color和new Apple().color是一样的。另外,细心的小伙伴会发现函数里我写了一个return。return的作用是返回大家都知道。但是 return ; return 1; return null; return undefined;return {}; return function(){};呢?
    简单总结:如果返回了一个对象,那么this指向的就是那个对象,否则指向的还是函数实例。null和undefined比较特殊,指向的也是函数实例。

    水平有限,讲的不对的地方恳请各位看过的前辈指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值