敲代码的77 2022-05-18 19:34 采纳率: 73.7%
浏览 36
已结题

关于函数的this指向问题

var name = 'window';

    var person1 = {
      name:'person1',
      foo1:function() {
        console.log(this.name);
      },
      foo2: () => console.log(this.name),
      foo3:function() {
        return function() {
          console.log(this.name);
        }
      },
      foo4:function() {
        return () => {
          console.log(this.name);
        }
      }
    }

    var person2 = {name:'person2'};

    person1.foo1();//person1
    person1.foo1.call(person2);//person2

    person1.foo2();
    person1.foo2.call(person2);

    person1.foo3()();
    person1.foo3.call(person2)();
    person1.foo3().call(person2);

    person1.foo4()();
    person1.foo4.call(person2)();
    person1.foo4().call(person2);

只懂前两个。。箭头函数中,this不是指向定义箭头函数的上下文吗,在person1中定义,怎么指向window?还有下面的也不懂,return一个函数的this是指向哪里?

  • 写回答

2条回答 默认 最新

  • Heerey525 前端领域新星创作者 2022-05-18 21:39
    关注
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
        <title>document</title>
      </head>
      <body>
        <script type="text/javascript">
          var name = "window";
    
          var person1 = {
            name: "person1",
            foo1: function () {
              console.log(this.name);
            },
            foo2: () => console.log(this.name),
            foo3: function () {
              return function () {
                console.log(this.name);
              };
            },
            foo4: function () {
              return () => {
                console.log(this.name);
              };
            },
          };
    
          var person2 = { name: "person2" };
          // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions
          // 原因一:箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this
          // 原因二:由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this---译者注),他们的第一个参数会被忽略。
    
          person1.foo1(); // person1 person1调用foo1方法 所以指向foo1
          person1.foo1.call(person2); // person2 call强制将this指向person2
    
          person1.foo2(); // window 原因一 person1.foo2上一层就是全局,所以指向window
          person1.foo2.call(person2); // window 原因一 person1.foo2上一层就是全局,所以指向window
    
          person1.foo3()(); // window 其实是(person1.foo3())() 有用到柯里化,所以指向window
          person1.foo3.call(person2)(); // window 其实是(person1.foo3.call(person2))() 有用到柯里化,所以指向window
          person1.foo3().call(person2); // person2 其实是(person1.foo3()).call(person2) call强制将this指向person2
    
          person1.foo4()(); // person1 原因二原因一 person1.foo4()()上一层就是person1.foo4,所以指向person1
          person1.foo4.call(person2)(); // person2 原因二原因一 person1.foo4()()上一层就是person1.foo4,然后call强制将this指向person2,所以指向window
          person1.foo4().call(person2); // person1 原因二原因一 person1.foo4()()上一层就是person1.foo4,所以指向person1
        </script>
      </body>
    </html>
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 5月18日

悬赏问题

  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化