news 2026/9/26 6:22:28

什么是箭头函数 (Arrow Function)?跟一般的函数有什么差別?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是箭头函数 (Arrow Function)?跟一般的函数有什么差別?

文章目录

  • 什么是箭头函数 (Arrow Function)?跟一般的函数有什么差別?
    • 1.语法更为简单
    • 2.this值和一般函数不同
    • 3.没有自己的arguments
    • 4.不能作为构造函数使用

什么是箭头函数 (Arrow Function)?跟一般的函数有什么差別?

箭头函数和一般函数的主要差异有四点,我们将在下方详细说明:

  • 箭头函数语法不同,写法更为简单
  • 箭头函数没有自己的 this,也无法直接修改 this 指向
  • 箭头函数没有自己的 arguments
  • 箭头函数不能作为构造函数使用

1.语法更为简单

箭头函数相比较一般函数,语法相当简单。除了少去 function 关键字,如果只有一个参数,箭头函数可以省略括号;只有一行代码,就是直接简单返回一個变数或简单的表达式,可以省略大括号和return。例子如下:

// ES5 一般函数letaddOne=function(n){returnn+1;};// ES6 箭头函数,参数只有一个时,参数的括号可以省略letaddOne=(n)=>{returnn+1;};// ES6 箭头函式,只有一行时,省略大括号和 returnletaddOne=(n)=>n+1;

2.this值和一般函数不同

配合前置查看:如何解释JavaScript 中 this 的值?

箭头函数没有自己的this值,箭头函数的this值是在一开始定义就決定,永远会是最接近自己的外层的普通函数中的this值。

此外,箭头函数也不适合使用 call、apply 和 bind 来绑定this值,绑定值会无效。

一般函数 this 绑定例子如下 :

constobj={num:100,};window.num=2020;constadd=function(a,b,c){returnthis.num+a+b+c;};//绑定 this 值为 obj,obj 的 num 为 100,所以 resultCall 是 106constresultCall=add.call(obj,1,2,3);console.log(resultCall);// 106

this 绑定会无效,以下为例子

constobj={num:100,};window.num=2020;constadd=(a,b,c)=>this.num+a+b+c;// 绑定 this 无效,add 函数的 this 会是 window// 所以 num 会是 2020,resultCall 则是 2026console.log(add.call(obj,1,2,3));// 2026

箭头函数根本没有自己的 this,call/apply/bind 对它不生效,非严格模式下,当前这个箭头函数 this 的上一层是 Window

利用箭头函数没有自己的this值的特性,很适合用在 setTimeout() 和 EventTarget.prototype.addEventListener() 等方法当中,因为它可以自动绑定在合适的范围中。可以看到下方setTimeout当中,用一般函数中用箭头函数的this区别:

// 一般函式版本,this 值在这个情况下是 NaNconstobj={count:10,doSomethingLater(){setTimeout(function(){// 此 function 为一般函数,因此 this 指向 windowthis.count++;console.log(this.count);// NaN (因为在 windonw 中没有 count)},300);},};obj.doSomethingLater();// 箭头函数版本constobj={count:10,doSomethingLater(){// 此 function 为箭头函数,因此 this 会依据最接近的父层一般函数的 this 值,这里为 objsetTimeout(()=>{this.count++;console.log(this.count);// 11 (obj 的 count 原本是 10,10++ 会是 11)},300);},};obj.doSomethingLater();

3.没有自己的arguments

前置知识 arguments:

arguments 是“函数在运行时,自动生成的一个类数组对象”,里面保存了你调用这个函数时传入的所有实参。

当你调用一个普通函数时(不是箭头函数的时候)

function foo(a, b) { console.log(arguments); } foo(1, 2, 3); //JS 引擎会在函数内部偷偷给你一个东西: arguments = { 0: 1, 1: 2, 2: 3, length: 3 }

arguments 是类数组对象,不是数组

arguments.length;// ✅arguments[0];// ✅arguments.map();// ❌

拓展知识 rest参数:

arguments 是旧写法,类数组,现代写法是 剩余参数(rest parameter),得到的是真正的数组

functionfn(a,b,...rest){console.log(a);// 第一个console.log(b);// 第二个console.log(rest);// 剩下的}fn(1,2,3,4,5);12[3,4,5]// 当然了可以直接写functionfn(...rest){console.log(rest);// 剩下的}[1,2,3,4,5]

箭头函数没有arguments对象,但好处是,箭头函数可以获取最近的非箭头函数的arguments对象,如下例子

constarguments=[1,2,3];constarr=()=>arguments[0];arr();// 1// 一般函数有 arguments 对象,就是传入的参数,在这个的一般函数 arguments 是 [3]// 所以 arguments[0] 也会是 3// f() 则会是 3 + 3functionfoo(n){constf=()=>arguments[0]+n;returnf();}foo(3);// 3 + 3 = 6

如果需要使用到箭头函数的所有参数,可以用以下剩余参数(rest parameter)的写法得到

4.不能作为构造函数使用

箭头函数不能作为构造函数使用,换言之不能用new关键字调用,会报错

constarrowFun=()=>{};newarrowFun();// error: arrowFun is not a constructor
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 14:37:48

Jmeter+influxdb+grafana 性能测试结果监控

我们做性能测试的时候使用Jmeter自身的监听器统计压测结果虽然可以统计到各个维度的信息,比如TPS,RT,Err等,但是这个Jmeter本身的监控没有办法做存储,也没有办法去找历史数据,所以如果想要持久化储存数据&a…

作者头像 李华
网站建设 2026/9/20 14:44:48

Jmeter性能测试 -3数据驱动实战

什么是数据驱动? 从数据文件中读取测试数据,驱动测试过程的一种测试方法。数据驱动可以理解为更高级的参数化。 特点:测试数据与测试代码分离;数据控制过程 好处:降低开发和维护成本,减少代码量&#xf…

作者头像 李华
网站建设 2026/9/20 14:48:40

Java基于Spring Boot+Vue的宠物领养系统

所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到 这里写目录标题项目介绍系统实现截图技术栈介绍Spring Boot与Vue结合使用的优势Spring Boot的优点Vue的优点Spring Boot 框架结构解析Vue介绍系统执行流程Java语言介绍系统测…

作者头像 李华
网站建设 2026/9/25 11:01:57

从黑土到云端,富裕县年货节开启乡村振兴数字新篇

当龙江大地仍被冰雪覆盖,一场连接乡土与全国的年货盛宴已在哈尔滨温情启幕。2026年1月15日,“云购年货乐购富裕”网上年货节在哈尔滨新区数字贸易产业园区正式举办,作为活动核心组成部分的展厅环节,不仅是“富裕优品”的集中亮相&…

作者头像 李华
网站建设 2026/9/20 13:34:32

springboot基于顾客偏好的唯品会推荐系统设计与实现

背景分析电子商务平台如唯品会面临用户选择多样性与信息过载问题。传统推荐方式依赖历史行为数据,难以精准捕捉顾客动态偏好,导致推荐结果同质化、转化率下降。SpringBoot作为轻量级Java框架,具备快速集成机器学习组件、微服务化部署能力&…

作者头像 李华