js箭头函数和普通函数区别

实验环境:nodejs v12.16.1

  1. 箭头函数不能作为构造函数,而普通函数可以

  2. 箭头函数没有原型,而普通函数有

  3. 箭头函数return可以省略语句块。(如果=>右边不是语句块,则代表return右边的表达式或对象)

  4. 箭头函数不绑定arguments(注意:浏览器环境下获取箭头函数的arguments会报错),而普通函数argument绑定了参数列表对象

  5. this指向问题[重点,也是难点]

    • 箭头函数的this指向上层函数作用域的this对象,如果没有上层函数作用域,则指向顶部this(在浏览器中顶部this则是window)。普通函数的this指向该函数的调用者
    • call, apply, bind会改变普通函数的this,但不会改变箭头函数的this

      实践是检验真理的有效标准,在此,我们必须更加深入了解,再耐心看一个复杂的例子:
      依然是nodejs环境下:
    data = 40; // 全局作用域赋予data=40
    this.data = 30; // 给顶部this赋予data=30
    let pig = {data: 80,
    };
    let o = {data: 10,a(n) {let f = (n) => {// 分析如下:// 首先f是箭头函数,那么f的this指向上层函数作用域的this,f的上层函数作用域是a,因此f的this指向a的this// 由于a是普通函数,因此a的this指向a的调用方// 因此f的this指向a的调用方return n + this.data;};return f(n);},b(n) {let f = (n) => {return n + this.data;};let other = {data: 20,};// 分析如下:// 和函数a的情形分析一样,这里的f的this指向是b的调用方// 然而 call,bind,apply 并不会改变箭头函数的调用方,因此f.call(other, n)并不会把this指向otherreturn f.call(other, n);},c(n) {let f = function (n) {// 分析如下:// f是普通函数,因此f的this指向f的调用方return n + this.data;};let other = {data: 20,};// 分析如下:// call会改变普通函数的调用方,因此f.call(other, n)把this指向了otherreturn f.call(other, n);},d: (n) => {let f = (n) => {// 分析如下:// f是箭头函数,因此f的this指向上层函数作用域d的this// 由于d也是箭头函数,由于d没有再上层的函数作用域了,因此d的this指向顶部this// 因此f的this指向顶部thisreturn n + this.data;};return f(n);},e(n) {let f = function (n) {return n + this.data;};let other = {data: 20,};// g的this指向other了let g = f.bind(other);return g(n);},e1(n) {let f = function (n) {return n + this.data;};// 注意,nodejs下这里f的调用方是global(注意nodejs下的顶层this并不等于global,顶层this是当前模块的this)return f(n);},e2(n) {let f = (n) => {return n + this.data;};let other = {data: 20,};// bind对箭头函数不起作用,f的this -> e2的this -> e2的调用方let g = f.bind(other);return g(n);},
    };console.log(o.a(1)); // 11
    console.log(o.b(1)); // 11
    console.log(o.c(1)); // 21
    console.log(o.d(1)); // 31
    console.log(o.e(1)); // 21
    console.log(o.e1(1)); // 41
    console.log(o.e2(1)); // 11console.log(`============接下来比较复杂,但是要搞清楚=========================`);// 分析:
    // o.a普通函数,因此bind把o.a的this指向pig
    // o.a里面的f的this指向o.a的调用方,因此f的this指向pig
    console.log(o.a.call(pig, 1)); // 81console.log(o.b.call(pig, 1)); // 81console.log(o.c.call(pig, 1)); // 21console.log(o.d.call(pig, 1)); // 31console.log(o.e.call(pig, 1)); // 21console.log(o.e1.call(pig, 1)); // 41// 分析
    // o.e2普通函数,因此bind把o.e2的this指向pig
    // o.e2里面的f是箭头函数,因此f指向上层函数作用域o.e2的this,而o.e2的this指向了pig,因此f的this指向pig
    // o.e2里面的f是箭头函数,不会被bind改变指向,因此g的this也指向pig
    console.log(o.e2.call(pig, 1)); // 81
    
  6. 箭头函数内不能用yield且不能用作Generator函数,而普通函数可以。

js箭头函数和普通函数区别相关推荐

  1. JS中箭头函数和普通函数的五种区别

    区别一:this关键字的指向 在普通函数中this指向调用这个函数的对象. 在构造函数中,this指向对象的实例. 在箭头函数中,没有this关键字,但是可以捕获上下文中的this用在箭头函数内部,并 ...

  2. js中箭头函数和普通函数区别

    一.箭头函数和普通函数 箭头函数相当于匿名函数,并且简化了函数定义. 箭头函数有两种格式,一种只包含一个表达式,连{ - }和return都省略掉了. 还有一种可以包含多条语句,这时候就不能省略{ - ...

  3. es6箭头函数_【知识点】ES6箭头函数、箭头函数与普通函数的区别

    作者:長安曹公子 文章出处:ES6 - 箭头函数.箭头函数与普通函数的区别 一.基本语法 ES6中允许使用箭头=>来定义箭头函数,具体语法,我们来看一个简单的例子: // 箭头函数 let fu ...

  4. JS箭头函数用户和箭头函数转成普通函数处理方法

    1 箭头函数 箭头函数是ES6出现的新的函数形式 即,使用ES6箭头函数语法定义函数,将原函数的"function"关键字和函数名都删掉,并使用"=>"连 ...

  5. js函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

  6. 箭头函数和普通函数有什么区别?

    箭头函数和普通函数有什么区别? 1:写法不一样 2:普通函数存在变量提升的现象 3:箭头函数不能作为构造函数使用 4:两者this的指向不同 5:箭头函数的arguments指向它的父级函数所在作用域 ...

  7. 2022年了,你还没搞清楚箭头函数与普通函数的区别嘛?

    目录 1.箭头函数简介 2.箭头函数与普通函数的区别 A.声明方式不同,匿名函数 B.this指向不同 C.箭头函数的this永远不会变,call.apply.bind也无法改变 D.箭头函数没有原型 ...

  8. 箭头函数与普通函数的区别

    箭头函数与普通函数的区别 1.外形不同:箭头函数使用箭头定义,普通函数中没有. 2. 箭头函数全都是匿名函数:普通函数可以有匿名函数,也可以有具名函数 3.箭头函数不能用于构造函数:普通函数可以用于构 ...

  9. JS变量、属性、方法、函数的相同点和区别

    JS变量.属性.方法.函数的相同点和区别 1. 变量和属性的相同点 变量和属性都是来存储数据的 2. 变量和属性的区别 变量需要单独声明并赋值,使用的时候直接写变量名,单独存在:属性是在对象里面,不需 ...

最新文章

  1. 微软开放 .NET 框架源代码
  2. ZOJ3531: [SDOI2014] 旅行
  3. MySQL 按指定字段自定义列表排序
  4. Python黑客编程3网络数据监听和过滤
  5. Mybatis Mapper动态代理方式 typeAliases 别名的使用
  6. 计算机科学与技术a类学科,清华大学a类学科有哪些?附清华a类学科名单
  7. python模块导入与使用
  8. 读SUCH AMERCAN和贾平凹的画集
  9. ResNet网络理解
  10. sid更新 续订sas软件_更新SAS 9.4(64位) SID的方法
  11. Peer-To-Peer 综述(P2P技术综述)
  12. (已解决)spring-boot maven报错Project 'org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  13. 免费ICP域名备案查接口
  14. 双目相机标定Matlab
  15. Coursera吴恩达《构建机器学习项目》课程笔记(2)-- 机器学习策略(下)
  16. 短视频剪辑技巧分享,先做排序不能忘,观看效果会更佳
  17. Mysql 第二章 数据库 DML和DQL
  18. 利用echarts做图表统计
  19. Harpoon: an OSINT / Threat Intelligence tool
  20. 经济危机,其实机会大于危险

热门文章

  1. 使用Java 8处理并行数据库流
  2. 如何更新Jenkins作业发布config.xml
  3. jpa 查询 列表_终极JPA查询和技巧列表–第3部分
  4. 学习Spring-Cloud –编写微服务
  5. 隐藏的东西? 您需要HiddenSidesPane
  6. Java文件合并变得语义化
  7. JavaFX 2.0布局窗格– GridPane
  8. Java EE 6测试第二部分– Arquillian和ShrinkWrap简介
  9. Hadoop:简单介绍
  10. mysql启动命令 windows_Windows下Nginx的启动停止等基本操作命令详解