JS(javascript)中this的指向问题

众所周知,this的指向问题一直是JS中比较难的问题,很多时候我们都搞不清this到底指向的谁。今天,我就来给大家讲一下this的指向问题。

一句话概括:谁调用this,this就指向谁。

接下来给大家举几个简单的例子:

 var lilei = {
        name : "lilei",
        age : 18,
        say : function() {
            console.log(`我叫${this.name},今年${this.age}`);
        }
    }

lilei.say();    // 调用lilei的say方法

大家都知道上述例子中返回的结果为:“我叫lilei,今年18” 。可大家知道这其中的原理是什么吗?

首先,我们得明白一个问题,为什么此例中的say方法要获取自己对象中的name和age属性要加this.?

如果不加this. 会怎样?很显然,会报错,因为say方法的作用域中不存在name和age属性。有朋友会说,say方法、name和age属性不都是属于 lilei 这个对象嘛,他们应该是属于同一个作用域,按理来说都可以彼此访问啊。

这里我们得弄清楚一个问题,对象到底有没有作用域?答案是:没有。

为什么:因为JS只有全局作用域(window)和局部作用域(函数内部)2种作用域,而对象刚好两者都不是。

所以:我们调用say方法时,say方法会在他的作用域链中进行寻找,到底有没有name和age属性,显而易见,say的局部作用域中没有,那么 就在window中寻找,刚好window中也没有。所以不加this.结果就会报错。

而我们要想访问,就得用this,加了this 的属性就会等待被调用,这里的say方法是被lilei调用的,按照最上面所说的,谁调用this,this就指向谁。那么这里的this.name和this.age就指的是lilei对象中的name和age属性的值。所以,会返回 “我叫lilei,今年18”。

接下来,再举个例子来应证这句话:“谁调用this,this就指向谁”。

    var lilei = {
        name : "lilei",
        sex : "male",
        age : 18,
        say : function() {
            console.log(`我叫${this.name},今年${this.age}`);
        }
    }

    lilei.say();    // 调用lilei的say方法


    var mike = {
        name : "mike",
        age : 20
    }

    mike.say = lilei.say;    // 将lilei对象中的say方法赋给mike的say方法(mike没有say方法就会创建一个say方法)
    mike.say();              // 调用mike的say方法

    var say = lilei.say;    //将lilei对象中的say方法赋给一个新的变量
    say();                  //调用say方法

我们先讲mike.say()会返回什么?这里赋值之后,有的朋友可能会认为,既然是lilei的say方法,那么mike的say方法应该是指向的lilei的say方法。依然会返回“我叫lilei,今年18”。可结果却恰恰相反,返回的是“我叫mike,今年20”。

按照我们所说的口诀:“谁调用this,this就指向谁”。那么这里this指向的就是mike对象,刚好mike对象中有name和age属性,可直接进行调用。所以,这里返回的结果就是:“我叫mike,今年20”。

再来讲最后面的say()会返回什么,这里我们是将lilei对象中的say方法赋给了say变量,如果按照上面有的朋友认为的,那么应该会继承lilei中的say方法,返回“我叫lilei,今年18”。但是结果却不尽人意,并是不。

同样,按照我们所说的口诀,“谁调用this,this就指向谁”。那么这里的this就指向了全局window,有的朋友说为什么是全局window,这里的say() 实际上就等同于 window.say(),所以就是window调用了say方法,this就指向了window,同时,say方法就会去window中找寻name和age属性的值,但是我们这里并没有在window全局作用域中声明name和age属性,因此就没找到,所以这里返回的结果就是undefined未定义。

以上就是关于this的指向问题,可能有些地方没讲明白,希望见谅,如果有不懂的地方或者有什么意见建议,请在下方留言或者联系本人(QQ:1203755476)。

谢谢大家的观看,希望大家多多关注我,本人博客(https://www.small0613.com),本人会不定期为大家更新相关资源与教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值