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。

相关推荐

  1. this指向

    2024-07-15 00:56:02       22 阅读
  2. Linux cp命令(cp指令

    2024-07-15 00:56:02       45 阅读
  3. this指针

    2024-07-15 00:56:02       23 阅读
  4. this指向

    2024-07-15 00:56:02       42 阅读
  5. PDF格式解析:Contents stream绘制指令

    2024-07-15 00:56:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 00:56:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 00:56:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 00:56:02       58 阅读
  4. Python语言-面向对象

    2024-07-15 00:56:02       69 阅读

热门阅读

  1. AI究竟是在帮助开发者还是取代他们?

    2024-07-15 00:56:02       20 阅读
  2. C语言 判断素数

    2024-07-15 00:56:02       18 阅读
  3. ios CCRectangleBlock.m

    2024-07-15 00:56:02       17 阅读
  4. Spring之常见注解

    2024-07-15 00:56:02       19 阅读
  5. Golang 后端面经

    2024-07-15 00:56:02       21 阅读
  6. 印度标普基金关门,继续套利美元债LOF

    2024-07-15 00:56:02       20 阅读
  7. 基于深度学习的点云平滑

    2024-07-15 00:56:02       19 阅读
  8. 【网络编程】poll函数

    2024-07-15 00:56:02       18 阅读
  9. 19. 删除链表的倒数第 N 个结点

    2024-07-15 00:56:02       16 阅读
  10. PyMysql error : Packet Sequence Number Wrong - got 1 expected 0

    2024-07-15 00:56:02       20 阅读
  11. TCP和UDP知识点

    2024-07-15 00:56:02       21 阅读
  12. 【C++】指针学习 知识点总结+代码记录

    2024-07-15 00:56:02       19 阅读
  13. 游戏开发面试题1

    2024-07-15 00:56:02       17 阅读