• this是什么?为什么要改变this?怎么改变 this 指向?


    目录

    this 是什么?

    箭头函数中的 this

    为什么要改变 this 指向?

    改变 this 指向的三种方法

    call(无数个参数)

    apply(两个参数)

    bind(无数个参数)


    this 是什么?

    1. 在对象方法中,this 指的是所有者对象(方法的拥有者)。
      1. var person = {
      2. firstName: "Jasmine",
      3. lastName: "Ge",
      4. id: 10108888,
      5. fullName: function(){
      6. return this.firstName + " " + this.lastName;
      7. }
      8. };
      9. console.log(person.fullName()) // Jasmine Ge
    2. 单独的情况下,this 指的是全局对象。
      1. // 在浏览器窗口中
      2. this
      3. // Window {window: Window, self: Window, document: document, name: '', location: Location, …}
    3. 在函数中,this 指的是全局对象。
      1. (function myFunction(){
      2. return this;
      3. })()
      4. // Window {window: Window, self: Window, document: document, name: '', location: Location, …}
    4. 在函数中,严格模式下,this 指的是 undefined。
      1. // js 严格模式不允许默认绑定,因此,在函数中使用时,在严格模式下,this 是未定义的undefined
      2. "use strict";
      3. (function myFunction(){
      4. return this;
      5. })()
      6. //undefined
    5. 在事件中,this 指的是接收事件的元素。
      1. <button onclick = "this.style.backgroundColor='skyblue'; console.log(this)">
      2. 点击来帮我改变颜色!
      3. button>

    箭头函数中的 this

    箭头函数中的 this 等同于上一层非箭头的函数的 this 值或全局对象(window 或 undefined)

    解释: 在箭头函数中,this 的指向是由外层(函数或者全局)作用域来决定,如果往外层作用域查找 this 的指向,只要没有非箭头函数(普通函数)的包裹,就一直往外层查找,直到最外层的全局作用域。如果没有非箭头函数(普通函数)的包裹,即使包裹再多层对象 this 也是指向全局作用域的。

    1. let name = 'obj'
    2. let obj1 = {
    3. name: 'obj1',
    4. obj2: {
    5. name: 'obj2',
    6. obj3: {
    7. name: 'obj3',
    8. obj4: {
    9. name: 'obj4',
    10. fn: () => {
    11. console.log(this) // node环境中输出 {},浏览器中输出 window
    12. }
    13. }
    14. }
    15. }
    16. }
    17. obj1.obj2.obj3.obj4.fn()
    18. // Window {0: Window, 1: Window, window: Window, self: Window, document: document, name: 'obj', location: Location, …}

    为什么要改变 this 指向?

    项目中有如下类似例子,find 函数中的 this 指向调用它的 obj 对象;而在定时器 setTimeout 中调用 find(),this 是指向 window 对象的。但我们需要 find 函数中 的 this 指向 obj 对象,因此我们需要修改 this 的指向。

    1. var position = "这是 windows 的 position";
    2. let obj = {
    3. position: "这是 obj 的 position",
    4. find: function() {
    5. console.log(this.position)
    6. }
    7. };
    8. obj.find(); // 这是 obj 的 position,this指向obj对象
    9. setTimeout(obj.find, 0); // 这是 windows 的 position,由于 setTimeout() 是异步操作,this 指向 window 对象

    改变 this 指向的三种方法

    共同点:第一个参数都为改变 this 的指针。若第一参数为 null / undefined,this 默认指向 window

    call(无数个参数)
    • 没有参数的时候,指向window
    • 有一个参数的时候,指向当前参数
    • 有多个参数,this指向第一个参数,剩下的参数是参数列表
    1. function fn(a, b, c){
    2. console.log(this, a + b + c); // this指向window
    3. }
    4. fn();
    5. // Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
    6. fn.call(document, 1, 2, 3); // call 之后 this 指向 document
    7. //输出 #document 6 1,2,3是实参 结果相加为6
    apply(两个参数)
    • 没有参数的时候,指向window
    • 有一个参数的时候,指向当前参数
    • 有多个参数,this指向第一个参数,剩下的参数是数组
    1. function fn(a, b, c){
    2. console.log(this, a+b+c);
    3. }
    4. fn();
    5. // Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
    6. fn.apply(document, [1, 2, 3]); // apply之后 this 指向 document
    7. // #document 6
    bind(无数个参数)
    • 没有参数的时候,指向 window
    • 有一个参数的时候,指向当前参数
    • 返回值为一个新的函数
    • 使用的时候需要手动调用下返回 的新函数(不会自动执行)
    1. function fn(a, b, c){
    2. console.log(this, a+b+c);
    3. }
    4. fn()
    5. // Window {0: Window, 1: Window, 2: Window, 3: Window, window: Window, self: Window, document: document, name: '', location: Location, …} NaN
    6. let ff = fn.bind('小明', 1, 2, 3);
    7. // 手动调用一下
    8. ff()
    9. // String {'小明'} 6

  • 相关阅读:
    Pytorch 自动求导的设计与实现
    7 进制数字转换
    订单30分钟自动关闭的五种解决方案
    辽宁博学优晨教育科技有限公司视频剪辑培训靠谱吗?
    Android JNI调用流程
    被一位读者赶超,手摸手 Docker 部署 ELK Stack
    LeetCode-剑指19-正则表达式匹配
    B端系统:导航机制设计,用户体验提升的法宝
    提升组件库通用能力 - NutUI 在线主题定制功能探索
    Linux的内存分页管理
  • 原文地址:https://blog.csdn.net/m0_73531461/article/details/136686613