欢迎来到代码驿站!

JavaScript代码

当前位置:首页 > 网页前端 > JavaScript代码

JS 箭头函数的this指向详解

时间:2022-08-17 14:53:57|栏目:JavaScript代码|点击:

箭头函数是ES6中的新增特性,他没有自己的this,其this指向从外层代码库继承。

使用箭头函数时要注意一下几点:

  • 箭头函数不能用作构造函数,用的话会抛出一个错误
  • 无法使用arguments参数,如果要用的话就用rest
  • 无法使用yield命令,所以箭头函数无法用作Generator函数
  • 因为没有自己的this,所以没法通过bind、call、apply来改变this指向
  • 但是这不代表箭头函数的this指向是静态的,我们可以通过改变它外层代码库的this指向来控制
  • 箭头函数的this从外层代码库继承,所以箭头函数的this是在定义的时候就绑定好了的,而普通函数是在调用的时候确定this指向
  • 字面量对象中直接定义的箭头函数的this不绑定该对象,而是往外找一层,最简单的情况是绑定到window

PS: 实际开发环境中,React可以使用箭头函数解决一个经典问题,这里不细说了。

给一个例子看一下箭头函数的实际情况:

const obj = {
  fun1: function () {
    console.log(this);
    return () => {
      console.log(this);
    }
  },
  fun2: function () {
    return function () {
      console.log(this);
      return () => {
        console.log(this);
      }
    }
  },
  fun3: () => {
    console.log(this);
  }
}

let f1 = obj.fun1(); // obj
f1() // obj

let f2 = obj.fun2();
let f2_2 = f2(); // window
f2_2() // window

obj.fun3(); // window

针对每行输出的分析:

let f1 = obj.fun1() // obj

这里明显进行的是隐式绑定,fun1的this指向obj

f1() // obj

这里执行了上一行返回出来的箭头函数,我们分析上一层代码库的this指向obj,所以直接继承,箭头函数this指向

objlet f2 =obj.fun2()

fun2第一层执行的时候没有打印代码,而是返回了一个函数出来,赋值给f2,并且这里发生了绑定丢失,this指向由原来的obj指向了window(发生了赋值)

let f2_2 = f2() // window

f2()执行了,打印出了改绑后的this——window,然后将箭头函数返回出来,赋值给f2_2f

2_2() // window

执行打印出window,刚才的外层代码的this不是指向了window吗,所以这里就继承了window作为this

obj.fun3() // window

在字面量中直接定义的箭头函数无法继承该对象的this,而是往外再找一层,就找到了window,因为字面量对象无法形成自己的一层作用域,但是构造函数可以哦。

那我们怎么操纵箭头函数的this指向呢:

答案是修改外层代码库的this指向,在箭头函数定义之前就给this修改方向即可。

在以上代码的基础上:

let fun4 = f2.bind(obj)() // obj
fun4() // obj

我们发现修改的是第二层方法的this指向,并且箭头函数也继承了下来。

  fun2: function () {
    return function () { // 我们修改的是这里的this
      console.log(this);
      return () => { // 然后这里定义的时候就继承啦
        console.log(this);
      }
    }
  },

总结

上一篇:原生js实现简易抽奖系统

栏    目:JavaScript代码

下一篇:微信小程序 用户数据解密详细介绍

本文标题:JS 箭头函数的this指向详解

本文地址:http://www.codeinn.net/misctech/211044.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有