this指向解析

先看题目:

第一题:

var name = 'window'
var person1 = {
    name: 'person1',
    show1: function () {
        console.log(this.name)
    },
    show2: () => console.log(th
    show3: function () {
        return function () {
            console.log(this.na
        }
    },
    show4: function () {
        return () => console.lo
    }
}
var person2 = { name: 'person2'
person1.show1()
person1.show1.call(person2)
person1.show2()
person1.show2.call(person2)
person1.show3()()
person1.show3().call(person2)
person1.show3.call(person2)()
person1.show4()()
person1.show4().call(person2)
person1.show4.call(person2)()


第二题:
var name = 'window'
function Person(name) {
    this.name = name;
    this.show1 = function () {
        console.log(this.name)
    }
    this.show2 = () => console.
    this.show3 = function () {
        return function () {
            console.log(this.na
        }
    }
    this.show4 = function () {
        return () => console.lo
    }
}
var personA = new Person('perso
var personB = new Person('perso
personA.show1()
personA.show1.call(personB)
personA.show2()
personA.show2.call(personB)
personA.show3()()
personA.show3().call(personB)
personA.show3.call(personB)()
personA.show4()()
personA.show4().call(personB)
personA.show4.call(personB)()

普通函数和匿名函数的this指向及特性:

普通函数:this指向调用函数的对象;若为构造函数,那么指向实例对象;箭头函数都是匿名函数;

匿名函数:this指向外面最近一层函数的this,如果最外层没有函数,那么在浏览器环境下指向windows;匿名函数的this不能使用call()、bind()、apply()改变;

解析过程:(第一个题的第一个小题用1.1表示)

1.1:调用person1中的show1函数,为普通函数,this指向本对象的this,因此打印person1。

1.2:调用person1中的show1函数,并将this指向改成person2,因此打印person2。

1.3:调用person1中的show2函数,为箭头函数,this指向外面最近一层函数的this,外面最近一层没函数,所以指向windows,因此打印window。

1.4:调用person1中的show2函数,使用call修改this指向,但是this2为箭头函数,不可修改,所以依旧打印window。

1.5:调用person1中的show3函数,并再次调用返回函数,show3和返回函数都是普通函数,调用show3之后返回一个匿名函数,之后再调用返回的匿名函数,相当于直接调用匿名函数,因此直接打印window。

1.6:调用person1中的show3函数,使用call修改返回函数的this指向,并再次调用返回函数,所以打印person2。

1.7:调用person1中的show3函数,使用call修改show3的this指向,并再次调用返回函数,而返回函数的this指向和show3的this指向无关,所以依旧打印window。

1.8:调用person1中的show4函数,并再次调用返回函数,show4为普通函数,返回函数为箭头函数,箭头函数的this指向为外面最近一层普通函数的this,即show4的this,因此打印person1。

1.9:调用person1中的show4函数,使用call修改返回函数的this指向,并再次调用返回函数,箭头函数的this不可改变,所以依旧打印person1。

1.10:调用person1中的show4函数,使用call修改show4的this指向,并再次调用返回函数,返回函数的this指向外面最近一层的普通函数,因此打印person2。

2.1:调用构造函数personA中的show1函数,为普通函数,因此打印personA。

2.2:修改调用构造函数personA中的show1的this指向,并调用,show1为普通函数,因此打印personB。

2.3:调用构造函数personA中的show2函数,为箭头函数,指向外层最近的普通函数的this,在第一题中,person1只是一个对象,所以指向windows,但是在第二题中,personA为构造函数,show2指向的就是personA,所以依旧打印personA。

2.4:改变构造函数personA中的show2函数this指向,并调用,但是show2为箭头函数,this不可修改,所以依旧打印personA。

2.5:调用构造函数personA中的show3函数,并再次调用返回函数,调用show3之后得到一个匿名函数,再次调用匿名函数this指向windows,所以打印window。

2.6:调用构造函数personA中的show3函数,改变返回函数的this,并调用返回函数,调用show3之后得到一个匿名函数,再次调用匿名函数this指向被修改为personB,所以打印personB。

2.7 :改变构造函数personA中的show3函数的this指向,并再次调用返回函数,返回函数的this指向和show3的指向无关,所以依旧打印window。

2.8:调用构造函数personA中的show4函数,并再次调用返回函数,show4为普通函数,this指向personA,返回函数为箭头函数,this指向外面最近一层普通函数的this,打印personA。

2.9:调用构造函数personA中的show4函数,改变返回函数的this,并再次调用返回函数,箭头函数的this不可修改,所以依旧打印personA。

2.10:修改show4的this指向,并调用,再调用返回函数,返回函数的this指向外面一层普通函数的this,因此打印personB。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值