JS中的this指向问题

      最近发现这个this还真的不能随便写,因为它实际的指向可能跟你想的不太一样,因此就会出现一些莫名其妙的问题,比如 ****undefined   为了避免这些错误,必须得搞懂this

先提一句:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

例1:

function f1(){
    var user = '二狗子';
    alert(this.user);  //undefined
    alert(this);   //object window
  }
 f1();  //实际上就是 window.f1();

这里调用方法f1的是window对象,也就是说this指向window对象,所以会出现this.user 为undefined

例2:

var a = {
    user: '二狗子',
    f1: function () {
      alert(this.user);
    }
  }
a.f1();  //二狗子

这里调用方法f1的是对象a,就是说this指向a对象,所以this.user为a对象里面的“二狗子”

接下来朝深处看看

例3:

var a = {
    user: '二狗子',
    f1: function () {
      alert(this.user);
    }
  }
  window.a.f1();  //二狗子

这段代码跟例2 比就是多了个window.  结果还是一样的,想说明什么问题呢,看下段代码

var a = {
    user: '二狗子',
    b: {
      user: '大傻子',
      f1: function () {
        alert(this.user);
      }
    }
  }
  a.b.f1();  //大傻子

      看见没,结果变成“大傻子”了,对比两段代码再结合最上面说的this指向调用它的对象,也就表名第一段代码是对象a调用的方法f1,第二段代码是对象b调用的,得出结论:在这种链式情况下,this指向的是它上一级的对象。可能表达的不太准确,反正就是那个意思。

再把b对象里面的user注释掉看看

var a = {
    user: '二狗子',
    b: {
      //user: '大傻子',
      f1: function () {
        alert(this.user);
      }
    }
  }
  a.b.f1();  //undefined

这里的this应该是指向b对象的,但是b里面没有user啊,肯定就是undefined,通过this就把指代的对象给定死了,反正this就是指的b,我不管你里面有没有这个user,没有就返回undefined,我可不会去拿a的user,千万别与链式作用域搞混了,像下面这样

  var user = '大傻子';  
  function f1(){
    var user = '二狗子';
    alert(user);  //二狗子
  }
  f1();

  function f2(){
    alert(user);  //大傻子
  }
  f2(); 

睁大眼看清楚了,这里没有this啊,所以执行f1的时候直接就是f1里面的user “二狗子”,执行f2的时候因为f2里面没有user,所以就朝外找,找到了外面的user "大傻子"

不能再多说了,待会该迷糊了。

再加个例子吧

例4:

  function f1(){
    this.user = "二狗子";
  }
  var a = new f1();
  alert(a.user); //二狗子

其实就是new 关键字可以改变this的指向,通过new关键字,把一个对象实例给了a,同时this的指向也变成了a对象

还想说的一点就是,看博客或者看其他东西不要太跟着博主的思路,首先不敢保证他说的就完全正确,毕竟那也只是基于他的理解,除非这个人就是权威;其次,有时候太跟着博主的思路走,容易把你给陷进去,因为你总是不由自主的想要往要往博主的思路上靠,其实你是在按照别人的思路在思考,有时候可能就把你自己的想法给湮没掉了,说不定你的想法更加简单,更加深刻。

参考博客:https://www.cnblogs.com/pssp/p/5216085.html

http://www.ruanyifeng.com/blog/2018/06/javascript-this.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值