箭头函数和它的this

        function MyObject() {
          this.value = 42;
          // 匿名函数
          this.anonymousFunction = function () {
            console.log(this.value, this); // 这里的this指向MyObject的实例
          };
          // 箭头函数
          this.arrowFunction = () => {
            console.log(this.value, this); // 这里的this也指向MyObject的实例,因为箭头函数捕获了外部函数的this
            // cb:这里的this创建实例的时候已经指向了实例,其他作用域调用这个函数,this一直指向该实例
          };
        }
        const obj = new MyObject();
        obj.anonymousFunction(); // 输出: 42
        obj.arrowFunction(); // 输出: 42
  
        // 如果作为回调函数使用
        setTimeout(obj.anonymousFunction, 1000); //cb这里是把这个函数的引用放在这,调用的对象是window ,this指向了window
        setTimeout(() => {
          // const a=obj.anonymousFunction
          // a()
          obj.anonymousFunction(); //cb:this主要是由调用对象决定的,这里的调用对象是obj,上面两行调用的是window
          // cb:一.这里的箭头函数只是作为一个回调函数,给需要执行的函数搭建一个全局作用域的环境(此环境this指向window)
          //实现了调用的函数可以选择它的调用对象
        }, 1000);
        setTimeout(obj.arrowFunction, 1000); // 输出: 42,因为箭头函数捕获了外部this
        //cb:箭头函数在实例化对象时绑定了该实例的this,不再改变
        //cb:箭头函数在写完代码的时候它的this已经确定了,跟它所处的作用域的this绑定了,不再改变和作用域的this保持一致;
        // 如果改变了,说明它处的作用域发生了变化,而作用域变化主要是普通函数的调用对象不同导致的
        let kkx=obj.arrowFunction  // cb:二、实例化对象时,箭头函数已经绑定了该对象,此时this不再改变
        kxx()
  1. 这里的箭头函数只是作为一个回调函数,给需要执行的函数搭建一个全局作用域的环境(此环境this指向window),实现了调用的函数可以选择它的调用对象
  2. 实例化对象时,箭头函数已经绑定了该对象,此时this不再改变,不管在任何作用域下调用都指向绑定的实例
          const obj = {
            value: 10,
            method: function () {
              console.log(this.value); // 这里 "this" 指向 obj
              // 定义一个箭头函数作为回调函数
              setTimeout(() => {
                console.log(this.value); // 这里 "this" 同样指向 obj,因为箭头函数捕获了外部函数的 "this"
                // cb:外部函数指的是method这个匿名函数
              }, 1000);
              return () => {
                console.log(this.value, this, 123);
              };
            },
            arrowFunc: () => {
              console.log(this.value); // 这里 "this" 不会指向 obj,而是指向全局对象(在浏览器中是 window)
            },
            kkx: this,// 当前作用域this指向window
          };
    
          // 调用方法
          obj.method(); // 输出:10(两次,因为setTimeout中的箭头函数也捕获了相同的 "this")
    
          // 尝试调用箭头函数
          obj.arrowFunc(); // 输出:undefined(在严格模式下)
          // 注意:这里的 "this" 不指向 obj,因为箭头函数在定义时并没有绑定到 obj 的上下文
          //   cb:一、寻找箭头函数的this,要看当前作用域的this
          //   cb:全局作用域:this指向window;具名函数作用域: this指向调用它的对象;块级作用域:this指向window
          //   cb:所以如果想要修改箭头函数的this,就把它放在某个具名函数的作用域内
          //   cb:这样当具名函数的this发生变化了,箭头函数的this也随之改变了
    
          // 为了证明箭头函数不绑定自己的 "this",我们可以在全局作用域中定义一个变量
          window.value = "global"; // 假设我们在浏览器环境中
          obj.arrowFunc(); // 输出:'global'(在浏览器环境中,箭头函数捕获了全局对象的 "this")
          console.log(obj.kkx); // 输出:window全局对象
          const aw = obj.method;
          const ao = obj.method();
          console.log(ao(), aw()()); //cb:二、通过具名函数作用域变化,箭头函数绑定this以后不再改变
    
    

  1. 寻找箭头函数的this,要看当前作用域的this
    全局作用域 this指向window,非箭头函数作用域 this指向调用它的对象,块级作用域 this指向window
    词法作用域意味着代码写完了作用域就确定了,所以如果想要修改箭头函数的this,就把它放在某个具名函数的作用域内
    这样当具名函数的this发生变化了,箭头函数的this也就改变了
  2. 通过非箭头函数作用域变化,箭头函数绑定this以后不再改变
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值