Why You Need Arrow Function in JavaScript?
为什么你需要箭头函数
前言
箭头函数是 ES6 版本中新增的语法,如今已经非常广泛地被使用,读完这篇文章可以帮助你认识箭头函数,并且了解这个语法的特性以及要注意的地方。
语法
要使用箭头函数,如字面上的意思就是会使用长得像箭头的符号 =>
来定义函数。以下是箭头函数的语法范例:
// 一般函数function functionName(parameter) { // ...}
// 无参数const functionName = () => { // ...};
// 一个参数(可省略小括弧)const functionOne = parameter => { // ...};
// 有多个参数(需添加括弧)const functionTwo = (parameter, parameterTwo) => { // ...};
// 解构参数(需添加括弧)const functionTwo = ({parameter}) => { // ...};
// 有默认参数(需添加括弧)const functionTwo = (parameter = {}) => { // ...};
functionName
为函数的名称,parameter
为函数的参数,可以有多个参数,如果没有参数,则使用空括号 ()
代替。
特性
箭头函数具备一些有趣的特性,可以留意一下。
隐晦回传 (Implicit Return)
一般函数都需要回传值,使用 return
关键字,如果没有回传值,则会回传 undefined
。箭头函数有一个特性,就是可以使用隐晦的方式来回传值,顾名思义,就是不需要使用 return
关键字来回传值,可参考以下范例:
// 单行const implicit = (value) => value;
// 多行(使用小括弧框起来)const implicit = (value) => ( value);
// 错误写法(对象必须用小括号包起来,避免被误解为函数的开头)const implicit = () => { value: 'Hello';};implicit(); // undefined
// 回传对象正确写法const implicit = () => ({ value: 'Hello' });implicit(); // { value: "Hello" }
不存在 arguments
箭头函数没有 arguments
参数是因其继承了其父作用域的 arguments
对象。这意味着当在箭头函数中引用 arguments
时,实际上是引用其父作用域中的 arguments
。我们可以使用以下的方式来获得所有传入匿名函数的参数。
const myFunction = (...args) => { console.log(args);};
myFunction(1, 2, 3); // 输出 [1, 2, 3]
不存在自身的 this
箭头函数并没有 this
,因此如果访问 this
,则会从外层作用域中继承 this
。
const bar = '全域苹果';const foo = { bar: '区域橘子', normalFunction: function () { // 传统函数,以此为基准产生一个作用域 console.log('1', this.bar); // 1 全域苹果 setTimeout(() => { console.log('2', this.name); // 2 区域橘子 console.log('3', this); // 3 foo }, 1000); }, arrowFunction: () => { // 如果使用箭头函数,this 指向外层的作用域 console.log('4', this.name); // 4 全域苹果 setTimeout(() => { console.log('5', this.name); // 5 全域苹果 console.log('6', this); // 6 window }, 1000); },};
foo.normalFunction();foo.arrowFunction();
实际用途
场合一:简化代码
最常见的使用箭头函数的方式就是可以让代码更为精简,但需要注意精简的代码并不总是代表更好的可读性。在适当的情况下,使用箭头函数来简化代码是可行的,并没有一个硬性的规则,端看偏好习惯。
// 一般函数的例子:function add(a, b) { return a + b;}
// 使用箭头函数来简化代码:const add = (a, b) => a + b;
// 一般函数的例子:document.getElementById('increment').addEventListener('click', function () { count++;});
// 使用箭头函数来简化代码:document.getElementById('increment').addEventListener('click', () => { count++;});
// 将一个数组中的每个元素转换成 li 标签// 结果:[ "<li>John</li>", "<li>Mary</li>", "<li>Peter</li>" ]const persons = ['John', 'Mary', 'Peter'];persons.map((person) => `<li>${person}</li>`);
场合二: 让 this
指向外层作用域
就像前面全域苹果和区域橘子的范例一样,适当的使用箭头函数可以让 this
指向外层作用域,达成特定的目的。
总结
活用箭头函数除了可以让代码变得更加精简外,本身也具备一些独特的属性值得探索!