敲代码的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 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys
  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 联想交换机NE2580O/NE1064TO安装SONIC